所以我有一个不确定数量的调用,我希望并行运行在任何例子中,我看到的承诺的数量是从一开始就知道的。
await Promise.allSettled([someCall(), anotherCall()]);
我的问题是我不知道在下面的代码中需要多少承诺,我可能有4个延迟或50个不同长度的延迟,但它似乎没有等待我任何想法。
let qq = bulk([1,2,3,4,5]);
console.log('last');
async function bulk(array){
const promiseArray = [];
for (const delay of array) {
promiseArray.push(bulkQuery(delay));
}
const valueArray = await Promise.allSettled(promiseArray);
}
async function bulkQuery(delay){
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(delay);
resolve('foo');
}, delay*1000);
});
}
这样写的话,你写函数的方式会有问题。
async function myFunction() {
let qq = await bulk([1,2,3,4,5]);
console.log('last');
async function bulk(array){
const promiseArray = [];
for (const delay of array) {
promiseArray.push(bulkQuery(delay));
}
const valueArray = await Promise.allSettled(promiseArray);
}
async function bulkQuery(delay){
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(delay);
resolve('foo');
}, delay*1000);
});
}
}
myFunction();
通过设计你的方法bulk也是一个'then '函数(返回promise)。这意味着在批量中执行将按照async和await,但任何async方法也返回一个承诺,这意味着你要么需要写一个then,要么通过将整个函数设置为async await(正如我在代码片段中所做的)
您的代码实际上可以工作,但仅在bulk
的上下文中。由于bulk
本身就是async
,它实际上是一个在幕后的承诺,所以你必须把它当作一个承诺来对待!
当你这样做的时候:
let qq = bulk([1,2,3,4,5]);
console.log('last');
您没有等待qq
承诺解决,您立即记录last
。你应该做的是-
let qq = bulk([1,2,3,4,5]);
qq.then(() => console.log('last'));