2014-12-05 46 views
2
return makeFirstPromise() 
    .then(function(res1) { 
     (...) 
    }) 
    .then(function(res2) { 
     (...) 
    }) 
    .then(function(res3) { 
     // **here I need to access res1** 
    }); 

我想知道當我需要訪問前一個承諾時,是否有最佳做法導致我的承諾鏈的後續功能。關於JavaScript Promise的最佳做法

我看到了兩個可能的解決方案:

var r1; 
return makeFirstPromise() 
    .then(function(res1) { 
     r1 = res1; 
     (...) 
    }) 
    .then(function(res2) { 
     (...) 
    }) 
    .then(function(res3) { 
     console.log(r1); 
    }); 

或窩後的第一個承諾,但它在視覺上打破了鏈序列:

return makeFirstPromise() 
    .then(function(res1) { 
     (...) 
     return secondPromise(res2) 
      .then(function(res3) { 
       console.log(res1); 
      }); 
    }); 

任何想法?

+0

的[?如何訪問的。那麼()鏈先前承諾的結果(精確複製http://stackoverflow.com/questions/28250680/how-do-i -access-previous-promise-results-in-a-then-chain) – Bergi 2015-01-31 10:58:08

回答

3

Promise語法構想爲be used in the first way。第二種語法非常快速地混淆。
但不要忘記將結果傳遞給下一個承諾。

var r1; 
return makeFirstPromise() 
    .then(function(res1) { 
     r1 = res1; 
     (...) 
     return r1; 
    }) 
    .then(function(r1) { 
     (...) 
    }); 
+0

問題是我的第二個承諾已經返回一個值(res2)。 – Guid 2014-12-05 16:08:31

+0

從結果中創建一個數組''''或對象'{}'。 – Clawish 2014-12-05 16:10:28

+1

如果我不控制第二個承諾(如nodejs函數),可能會導致複雜的代碼,但我更喜歡這個解決方案,而不是變量聲明解決方案。謝謝。 – Guid 2014-12-05 16:14:43

2

概念上承諾代理值,最簡單的方式使用它們的值是使用它們作爲代理。這是他們摘要:

var res1 = makeFirstPromise(); 
var res2 = res1.then(makeSecondPromise); 
Promise.all([res1, res2]).spread(function(firstResult, secondResult){ 
    // access both here, no nesting or closure hacks required. 
}); 
+0

不錯的想法,但我有一個承諾鏈,它可能是第七,需要從第三個承諾的結果,例如。 – Guid 2014-12-06 13:27:04

+0

爲什麼這麼重要?還要注意,像Bluebird這樣的一些承諾實現有一個你可以傳遞的上下文 - 看看藍鳥API的Promise#bind - 也可以解決你的問題。 – 2014-12-06 13:33:40