2014-12-05 82 views
2

我想要做的事很簡單,但我不明白一件小事......的NodeJS/Q:鏈接承諾依次

var Q = require('q'); 

var funcs = ["first", "second", "third", "fourth"]; 

function main(){ 

// really don't know how to chain sequentially here ... 
    var result = Q(); 

    funcs.forEach(function (f) { 
     result = treat(f).then(f); 
    }); 

} 

function treat(t){ 

    var deferred = Q.defer(); 

    setTimeout(function(){ 
     deferred.resolve("treated "+ t); 
    },2000); 

    return deferred.promise; 
} 

main(); 

我想我的funcs中數組的每一個元素被「處理「順序,輸出會再是這樣的:

treated first 
//2 seconds later 
treated second 
//2 seconds later 
treated third 
//2 seconds later 
treated fourth 

我不能做到這一點:(它應該是簡單的,我不明白的東西:(

回答

8

從你的例子來看,我會假設,你也是伊迪看到Sequences part of Q readme,但未能理解。

使用

原來的例子「瀑布」模型中,當作爲輸入到下一個傳遞的每個函數的輸出:

var funcs = [foo, bar, baz, qux]; 

var result = Q(initialVal); 
funcs.forEach(function (f) { 
    result = result.then(f); 
}); 
return result; 

但你只是想執行我們在序列中的所有功能,讓你可以簡單地每個功能綁定其變量:

var args = ["first", "second", "third", "fourth"]; 

var result = Q(); 
args.forEach(function (t) { 
    result = result.then(treat.bind(null, t)); 
}); 
return result; 

在我的例子treat功能將依次4次調用,result承諾將與最新treat呼叫(所有結果的值來解決以前的呼叫將被忽略)。

訣竅是,.then方法接受一個處理程序,它將在當前的promise被解析並返回一個新的promise後被調用。所以,你應該傳遞給.then一個應該在你的執行鏈的下一步調用的函數。 treat.bind(null, t)綁定treat功能與屬性t。換句話說,它返回一個新的函數,它會調用treat,傳遞t作爲它的第一個參數。