Js Promise.all没有正确返回

时间:2014-06-25 18:17:07

标签: javascript google-chrome-extension promise

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

Promise.all([
  new Promise(loadA),
  new Promise(loadB),
  new Promise(loadC)
])
.then(checkFunction)
.catch(errorHandler);

功能如下:

function loadA(){
   return load("A");
}

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

```

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

我也不明白为什么我会看到3 tried to fetch..个语句,因为Promise.all的规范声明,只要其中一个承诺拒绝或所有承诺解决后它就会返回 (来源:http://mzl.la/1jLTOHB)。我观察到的行为与这两种情况都不匹配,我可能做错了什么?

1 个答案:

答案 0 :(得分:6)

由于您的加载功能已经创建并返回一个承诺,它看起来像你只是想要这样:

Promise.all([
  loadA(),
  loadB(),
  loadC()
])
.then(checkFunction)
.catch(errorHandler);

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


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

Promise.all([
  load("A"),
  load("B"),
  load("C")
])
.then(checkFunction)
.catch(errorHandler);

你拥有它的方式,你创造的外部承诺永远不会得到解决或拒绝,因此.then().catch()永远不会被解雇。只是,load()函数内部的承诺得到了解决或拒绝。