看下面的代码,它使用
async
和await
来执行promises
列表。但它们将按顺序执行,这意味着一旦 promises[0]
解析,则仅开始执行 promises[1]
。
我想并行地激发所有的承诺并一起等待它们。我知道我们可以使用
Promise.all
来做到这一点,但是我们如何仅使用 await
和 async
来做到这一点?
// An array of promises
let promises = [
Promise.resolve(1),
Promise.reject("error"),
Promise.resolve(2),
];
// An async function that uses a for loop
async function useForLoop() {
try {
// Declare an empty array to store the results
let results = [];
// Use a for loop to iterate over the promises
for (let i = 0; i < promises.length; i++) {
// Use await to pause the execution until the current promise is resolved
let result = await promises[i];
// Push the result to the array
results.push(result);
}
// Log the results
console.log(results); // [1, 2]
} catch (error) {
// Handle any error from the promises
console.error(error); // "error"
}
}
一般来说,要允许两个任务同时运行,只需在您需要完成它们之前就不要等待它们。
例如:
pizza = await OrderPizza();
beer = await OrderBeer();
// Pizza is cold now because we waited before ordering beer :(
Eat(pizza);
Drink(beer);
...可以成为...
pizza = OrderPizza();
beer = OrderBeer();
// eat hot pizza as soon as it gets here.
Eat(await pizza);
// but beer may be warm now, depending on how long pizza took
Drink(await beer);
链完全解决了这个问题。你趁热吃披萨,趁冷喝啤酒。
OrderPizza().then(Eat);
OrderBeer().then(Drink);
不要等待,除非您需要延迟另一项操作或需要其结果。例如,晚饭后清理是这样的:
food = OrderPizza().then(Eat);
beverages = OrderBeer().then(Drink);
await food;
await beverages;
CleanUp();
(此外,Promise.All 可用于等待所有多个 Promise,或者 Promise.Any 可用于等待多个 Promise 中的第一个。)