我有几个函数要通过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)。我观察到的行为与这两种情况都不匹配,我可能做错了什么?
答案 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()
函数内部的承诺得到了解决或拒绝。