是否可以在其他 then for() 循环中使用 await ?

Is it possible to use await in other then for() loop?

有没有什么方法可以使用 async/await 在 NOT for 循环(例如 foreach、map)中调用异步函数,并仅在所有异步函数完成后才继续执行其余代码?

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");
})();

从技术上讲你 "can",但你不想。如果你有一组需要解决的承诺,最好用 Promise.all() 来解决它们。

您正在寻找 Promise.all()。它获取 Promises 的数组(或其他可迭代对象)和 returns 一个新的 Promise,当所有输入 Promises 解析时解析。输入 Promise 是并行执行的(比循环中每个 Promiseawait 要好得多)。

await这个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');

可以在async函数中使用await。因此,除了 for 之外,将它与 async 中使用的其他语句一起使用,即 do..whilewhile 循环语句。

Is there some way to call asynchronous function in NOT for loop (e.g. foreach, map)

这是另一种情况。基于回调的方法如 forEach 有自己的功能。在常规函数中使用 await 是不可能的:

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

async 函数与 awaitforEach 一起使用,因为它会导致一个被忽略的承诺:

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

使用 async..awaitmap 是可以接受的,因为它的工作方式,从 async 返回的承诺被 map 使用并映射到结果数组:

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

为了在 map 函数外等待,应显式链接 Promise:

await Promise.all(arrOfPromises);