2017-06-15 58 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