2017-06-15 57 views
0

基本问题,但这两个片段之间有区别吗?Promise chain - reference vs

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

你有没有真正尝试过吗?应该很明显,#2不能按预期工作。 – Bergi

+0

这是关于相同的差为'1之间+ 2 + 3;和''2 1 +; 1 + 3;'。 – Bergi

回答

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突变使用承诺的一个阵列,过滤器和减少的模式:

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 

这分开的承诺的实际确定指标的链接和条件。

+0

谢谢,我(绝对愚蠢)没有再次检查最终的返回值,我只是检查执行顺序,所有的承诺都得到解决...谢谢 – ladar