基本问题,但这2个片段之间有区别吗?
function test() {
var p2 = new Promise(function(resolve, reject) {
resolve(1);
});
p2 = p2.then(function(value) {
return new Promise(x=>{
window.setTimeout(()=>{
console.log("P finished");
x();}, 100);
});
});
if (condition) {
p2 = p2.then(function(value) {
return Promise.resolve(12);
});
}
p2 = p2.then(function(value) {
return new Promise(x=>{
window.setTimeout(()=>{
console.log("P3 finished");
x();
}, 1000);
});
});
return p2;
}
和
function test() {
var p2 = new Promise(function(resolve, reject) {
resolve(1);
});
p2.then(function(value) {
return new Promise(x=>{
window.setTimeout(()=>{
console.log("P finished");
x();}, 100);
});
});
if (condition) {
p2.then(function(value) {
return Promise.resolve(12);
});
}
p2.then(function(value) {
return new Promise(x=>{
window.setTimeout(()=>{
console.log("P3 finished");
x();
}, 1000);
});
});
return p2;
}
点用例是我有一些基于我构成整个承诺链的条件(每个承诺可能在此过程中被拒绝)所以我想知道这两种方式是否相同?我个人认为#1是正确的,但我更喜欢#2更简洁的语法。
答案 0 :(得分:1)
存在根本区别,因为在第二种情况中,您返回的最终承诺p2
将始终只返回值2
,而不会与其余代码链接它也会运行,但不会以任何方式影响返回的p2
解决的值。
一个简单的例子就是:
var p = new Promise(res => res(1));
p = p.then(() => new Promise(res => res(2)));
p = p.then(() => new Promise(res => res(3)));
p.then(v => console.log(v));
与
var p2 = new Promise(res => res(1));
p2.then(() => new Promise(res => res(2)));
p2.then(() => new Promise(res => res(3)));
p2.then(v => console.log(v));
在第一种情况下,会打印3
,但在第二种情况下会打印1
。
所以正确的版本是第一个。
你可以用来使它更具可读性并避免p
变异的模式是使用带过滤器的promises数组并减少:
var promises = [
new Promise(res => res(1)),
new Promise(res => res(2)),
condition ? new Promise(res => res(3)) : null];
return promises
.filter(p => !!p) // discards nulls from promises not passing condition
.reduce((finalP, p) => finalP.then(p), Promise.resolve()); // effectively chains all promises
这将链条和条件与承诺的实际定义分开。