2017-06-15 7 views
0

基本的な質問ですが、これらの2つのスニペットに違いはありますか?プロミスチェーン - リファレンス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; 
} 

ポイントユースケースは、私は全体の約束チェーンを構成しています(それぞれの約束は、プロセス中に拒否される可能性があります)ので、私は思ったんだけどそれに基づいて、いくつかの条件を持っていますこれらの2つの方法が同等であれば?個人的には#1が正しいと感じますが、私は#2がより簡潔な構文の方が良いのが好きです。

+0

実際に試しましたか? #2が意図したとおりに動作しないことはかなり明白です。 – Bergi

+0

「1 + 2 + 3;」と「1 + 2」の違いはほぼ同じです。 1 + 3; – Bergi

答えて

1

根本的な違いがありますので二ケースも実行されますが、どのような方法では影響はありませんあなたのコードの残りの部分との連鎖せず、常に単純に値2を返します返しp2最終約束で戻り値p2によって解決された値。

簡略化した例はこれです:

最初のケースで
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)); 

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)); 

3が印刷されているが、第2の場合に1が印刷されています。

正しいバージョンはです。最初はです。

あなたはそれをより読みやすく、フィルターと約束の配列を使用しているpの変異を回避し軽減するために使用することができ、パターン:これは約束の実際のdefintionからチェーンや条件を分離

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