调用异步等待并行调用数量不确定?



所以我有一个不确定数量的调用,我希望并行运行在任何例子中,我看到的承诺的数量是从一开始就知道的。

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'));

最新更新