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).我观察到的行为与这些场景中的任何一个都不匹配,我可能做错了什么?
你的加载函数已经创建并返回一个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()职能内部的承诺才得到解决或拒绝.