Создание обещания из кода, который использует await - PullRequest
0 голосов
/ 04 июня 2018

Я хотел бы написать блок кода с использованием синтаксиса await, немедленно выполнить его и создать обещание, ожидающее завершения выполнения.Я придумал следующий способ сделать это.

let makePromise = async () => {
    return foo && await bar();
}
let promise = makePromise();

Однако мне трудно это понять и понять.Создание функции и ее немедленный вызов кажется нелогичным и идет вразрез с хорошей практикой в ​​других языках программирования.Есть ли более идиоматический способ написания этого куска кода?

В частности, этот код используется в следующем контексте.

let promises = items.map((item) => {
    let makePromise = async () => {
        return foo(item) && await bar(item);
    }
    return makePromise();
});

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Почему бы не использовать асинхронную функцию напрямую?Следующий код ведет себя точно так же, как ваш пример, но имейте в виду, это приводит к массиву обещаний и await s ни одно из них.

function foo(x) { return "foo " + x; }
async function bar(x) { return "bar " + x; }
const items = [1];

let promises = items.map(
    async item => foo(item) && await bar(item)
);

Promise.all(promises).then(x => console.log(x));
0 голосов
/ 04 июня 2018

Асинхронные функции фактически возвращают Обещание.Это действительно:

const x = async () => {
  console.log(123)
}

x().then(() => {
  console.log(456)
})

Так что в вашем случае:

let promise = bar()
...