2015-08-19 56 views
1

試圖圍繞Javascript承諾包裹我的頭。我正在試驗Q庫。我有一些代碼,輸出什麼,我希望,但我不知道它是如何工作的:then()如何提供其參數

'require strict'; 

var Q = require("q"); 

function getFirst(){ 
    var deferred = Q.defer(); 
    var first = 5; 
    console.log("getting first: " + first); 
    deferred.resolve(first); 
    return deferred.promise; 
} 

function addSecond(first){ 
    var deferred = Q.defer(); 
    var second = 10; 
    console.log("adding second: " + second); 
    var result = first + second; 
    deferred.resolve(result); 
    return deferred.promise; 
} 

function printResult(result) { 
    console.log("result is + " + result); 
} 

getFirst() 
.then(addSecond) 
.then(printResult); 

在節點運行此我得到:

getting first: 5 
adding second: 10 
result is + 15 

我感到困惑的是如何addSecond和printResult在最終調用時獲取參數? '5'如何神奇地將它變成addSecond?如果addSecond需要一大堆參數呢?

感謝您對此發表看法。

deferred.resolve(first); 

所以價值5

+1

'then'給它的功能無論以前的承諾得到由'喂resolve'。如果你想'addSecond'被稱爲'addSecond(2,3)',你需要在它後面的promise中做'deferred.resolve(2,3)'。 – Amadan

+0

簡單的答案是「承諾的工作方式」。更詳細地說,promise通過傳遞給它的「then」方法的回調來傳遞結果。 –

回答

1

addSecond從獲得其參數。

var result = first + second; 
deferred.resolve(result); 

所以價值first + second

printResult從獲得其參數。


您可以試驗一下。將想要傳遞給函數的值傳遞到.resolve()並看到它正在改變。基本上,.resolve就像一個指向您傳遞給.then()的函數的指針。

0

當您調用承諾時,它會等待底層函數「解析」,然後調用傳遞解析值作爲參數的下一個函數(該值在deferred.resolve(first)上解析)。然後,新函數是否返回承諾循環重複,否則調用下一個函數傳遞返回值。

如果您需要傳遞多個參數,則可以返回一個數組。承諾

大演講:

0

你addSecond代碼可以簡化爲

function addSecond(first){ 
    var second = 10; 
    console.log("adding second: " + second); 
    return first + second; 
}