Js Promise.all没有正确返回

Nat*_*ndt 2 javascript google-chrome-extension promise

我有几个函数,我想通过Promises并行执行(loadA,loadB,loadC).

Promise.all([
  new Promise(loadA),
  new Promise(loadB),
  new Promise(loadC)
])
.then(checkFunction)
.catch(errorHandler);
Run Code Online (Sandbox Code Playgroud)

功能如下:

function loadA(){
   return load("A");
}
Run Code Online (Sandbox Code Playgroud)

其中A在适当时由B和C代替.加载功能是:

function load(value) {
  return new Promise(function(resolve, reject) {
    chrome.storage.sync.get(value, function (result) {
      if(!exists(result)){
        console.log("tried to fetch " + value + " from sync, could not find");
        reject("could not find the user information");
      } else {
        console.log("fetched " + value + " from sync: " + result.userId);
        resolve(result);
      }
    });
  })
}
Run Code Online (Sandbox Code Playgroud)

```

我正在做一些测试,当加载函数发送Promise时reject,出现问题.函数'next-in-line'是checkFunction,它不被调用,也不是errorHandler函数.我已经确认load承诺实际上是拒绝的,因为控制台显示3'试图获取......'语句.

我也不明白为什么我看到3个tried to fetch..语句,因为Promise.all的规范说它会在其中一个promise拒绝或者所有promise都解决之后立即返回(来源:http://mzl.la/1jLTOHB).我观察到的行为与这些场景中的任何一个都不匹配,我可能做错了什么?

jfr*_*d00 7

你的加载函数已经创建并返回一个promise,它看起来就像你只是想要这样:

Promise.all([
  loadA(),
  loadB(),
  loadC()
])
.then(checkFunction)
.catch(errorHandler);
Run Code Online (Sandbox Code Playgroud)

您构建代码的方式是,您启动三个并行运行的操作来加载"A","B"和"C".这三个操作独立运行,因此您看到三个"尝试获取..."消息(每个操作内部一个).只有在这三个独立操作之外,Promise.all()才会查看解决/拒绝状态并决定下一步该做什么.


事实上,你可以简化到这个:

Promise.all([
  load("A"),
  load("B"),
  load("C")
])
.then(checkFunction)
.catch(errorHandler);
Run Code Online (Sandbox Code Playgroud)

你拥有它的方式,你创造的外部承诺永远不会得到解决或拒绝,所以.then().catch()从未被解雇.只有,你load()职能内部的承诺才得到解决或拒绝.