首页 > 解决方案 > Promise.all 替换?

问题描述

有什么方法可以让我在 Javascript 中调用多个异步函数,但是一旦完成就得到调用的响应,这与等待所有异步调用完成的 Promise.all 不同?我想要的是,并行运行异步调用,并在其他调用仍在运行时立即获得相应调用的响应,然后更新反应状态。

我已经在使用 Promise.all 进行多个异步调用,但它会在所有调用完成时给出响应。

标签: javascriptasynchronousparallel-processing

解决方案


您可以迭代一系列承诺并更改每个承诺解决方案的状态:

let state = null;

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve({p1: 1});
  }, 2000);
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve({p2: 2});
  }, 1000);
});
const p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve({p3: 3});
  }, 3000);
});

// Iterate promises
[p1, p2, p3].forEach(p => {
  p.then(res => {
    state = Object.assign({}, state, res);
    console.log(state);
  });
});

console.log(state);

Promise您可以为此任务创建自己的方法:

if (!Promise.each) {
  Promise.each = function(promises, callback, error) {
    if (promises && Array.isArray(promises)) {
      promises.forEach(p => {
        p.then(res => {
          callback(res);
        }, err => {
          if (error) {
              error(err);
          } else {
              console.log(err);
          }          
        });
      });
    }
  }
}

// Usage
Promise.each([p1, p2, p3], updateState);

推荐阅读