【发布时间】:2017-05-24 17:20:10
【问题描述】:
我有一份承诺清单。
var p1 = {
run: function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("Promise 1 done");
}, 2000);
})
}
};
var p2 = {
run: function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
reject("Promise 2 reject");
}, 1000);
})
}
};
var p3 = {
run: function () {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("Promise 3 done");
}, 1500);
})
}
};
我想依次执行[p1,p2,p3]。我写了一个函数Process.sequence 来像Promise.all() 一样工作(在所有承诺都解决时解决,并在承诺拒绝后立即拒绝)
Process = {
sequence: function(promises){
window.promises = promises;
return new Promise(function (resolve, reject) {
promises.reduce(function (sequence, promise) {
return sequence.then(function () {
return promise.run();
}).then(function (result) {
console.log(result);
if (promises.indexOf(promise) == promises.length - 1) {
resolve("All Done");
}
}).catch(function (reason) {
reject(reason);
});
}, Promise.resolve());
});
}
};
但是当我运行Process.sequence...
Process.sequence([p1,p2,p3]).then(function(result){
console.log(result);
}, function(reason){
console.log(reason);
});
...即使p2 之前被拒绝,p3 仍然执行。
这是我期望的结果:
Promise 1 done
Promise 2 reject
但这是真正的结果:
Promise 1 done
Promise 2 reject
Promise 3 done
我的函数Process.sequence有什么问题?
更新
感谢@JaromandaX 的支持。函数Process.sequence应该是这样的。
Process = {
sequence: function(promises) {
return promises.reduce(function(sequence, promise) {
return sequence.then(function() {
return promise.run();
}).then(function(result) {
console.log(result);
});
}, Promise.resolve()).then(function() {
return "All Done";
});
}
};
【问题讨论】:
-
仅供参考,您永远不会得到“全部完成”,因为您在 if 语句之前有一个 return 语句,之后的任何内容都不会运行
-
避免 Promise 构造函数反模式
-
@PatrickEvans,谢谢你,我修好了,它奏效了。但主要问题仍然存在
-
@JaromandaX 你能解释更多细节吗? Promise 构造函数是如何反模式的?
-
你的代码本质上是jsfiddle.net/f3swpxyu
标签: javascript promise