在promise.all 是否可以知道请求完成的进度?

最近在做一个项目,现在同时有8个请求同时发送,在进入这个页面的时候需要做个进度展示,我想通过请求成功的数量来表示页面数据是否可以展示
所以想知道是否可以在promise.all中获取到已经成功的响应的数量

阅读 7.3k
2 个回答

无法知道。但你不是可以在每个任务结束时获取进度嘛。

let successCount = 0, failCount = 0;
Promise.all([
    request1()
      .then((res) => {
          successCount++;
          return Promise.resolve(res);
      })
      .catch((err) => {
          failCount++;
          return Promise.reject(err);
      }),
    
    request2()
      .then((res) => {
          successCount++;
          return Promise.resolve(res);
      })
      .catch((err) => {
          failCount++;
          return Promise.reject(err);
      })
]);

或者觉得太啰嗦可以抽一个方法出来:

function dosomething(tasks = []) {
    let successCount = 0, failCount = 0;
    return Promise.all(
        tasks.map(func => {
            return func()
              .then((res) => {
                  successCount++;
                  return Promise.resolve(res);
              }).catch((err) => {
                  failCount++;
                  return Promise.reject(err);
              })
        })
    );
}

dosomething([request1, request2]);

P.S. 两个 count 仅为统计,你可以自己加上回调函数之类的逻辑。

api中没有直接的支持,你可以设置一个外部变量,在每个任务完成的时候更新一下外部变量,这样就可以间接获取进度,不过这方案看上去不太优雅

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题