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

Call async await in parallel with an indeterminate amount of calls?

因此,在我看到的任何示例中,我希望并行进行的调用数量不确定。

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

您的代码确实有效,但仅在 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'));

改为这样,您编写函数的方式存在问题。

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 也是一个 'thenable' 函数(returns 承诺)。这意味着批量内部的执行将按照 async 和 await 但任何异步方法也是 returns 一个承诺,这意味着您需要编写一个 then 或通过将整个函数设置为异步等待来进行等待(正如我所拥有的)在代码片段中完成)