Можно ли использовать await в другом цикле for ()? - PullRequest
0 голосов
/ 10 октября 2018

Есть ли способ вызвать асинхронную функцию в цикле NOT for (например, foreach, map), используя async/await, и продолжить выполнение остального кода только после завершения всех асинхронных функций?

const layers = ["layer1", "layer2", "layer3"];

async function connect(layer: string): Promise<object> {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve(layer);
        }, 1000);
    });
}

(async function () {
    for (let i = 0; i < layers.length; i++) {
        const result = await connect(layers[i]);
        console.log(result, "connected");
    }
    console.log("All layers are connected");
})();

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы ищете Promise.all().Он получает массив (или другой итерируемый объект) Promise s и возвращает новый Promise, который разрешается, когда все входные данные Promise s разрешаются.Входные данные Promise выполняются параллельно (гораздо лучше, чем await -ing для каждого Promise в цикле).

You await this Promise.

const layers = ["layer1", "layer2", "layer3"];

async function connect(layer: string): Promise<object> {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve(layer);
        }, 1000);
    });
}

await Promise.all(layers.map(connect));
console.log('All layers are connected');
0 голосов
/ 10 октября 2018

Можно использовать await в функции async.И, таким образом, чтобы использовать его с другими операторами, которые используются в async, кроме for, а именно do..while и while операторов цикла.

Есть ли способ вызвать асинхронную функцию вНЕ для цикла (например, foreach, map)

Это другой случай.Методы на основе обратного вызова, такие как forEach, имеют свои собственные функции.Невозможно использовать await внутри обычной функции:

arr.forEach(() => {
  await ... // syntax error
});

Использование функции async вместе с await с forEach является обычной ошибкой , потому что это приводит к обещаниюигнорируется:

arr.forEach(async () => {
  await ... // isn't awaited outside function
});

Допустимо использовать async..await с map, так как он работает, обещание, возвращаемое из async, используется map и сопоставляется с результирующиммассив:

const arrOfPromises = arr.map(async () => {
  await ...
});

Обещания должны быть явно связаны, чтобы их можно было ожидать за пределами map Функция:

await Promise.all(arrOfPromises);
0 голосов
/ 10 октября 2018

Говоря технически, вы можете, но не хотите.Если у вас есть коллекция обещаний, которые нужно выполнить, лучше всего разрешить их с помощью Promise.all().

...