是否可以在其他 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()
。它获取 Promise
s 的数组(或其他可迭代对象)和 returns 一个新的 Promise
,当所有输入 Promise
s 解析时解析。输入 Promise
是并行执行的(比循环中每个 Promise
的 await
要好得多)。
你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..while
和 while
循环语句。
Is there some way to call asynchronous function in NOT for loop (e.g. 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
函数外等待,应显式链接 Promise:
await Promise.all(arrOfPromises);
有没有什么方法可以使用 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()
。它获取 Promise
s 的数组(或其他可迭代对象)和 returns 一个新的 Promise
,当所有输入 Promise
s 解析时解析。输入 Promise
是并行执行的(比循环中每个 Promise
的 await
要好得多)。
你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..while
和 while
循环语句。
Is there some way to call asynchronous function in NOT for loop (e.g. 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
函数外等待,应显式链接 Promise:
await Promise.all(arrOfPromises);