簡體   English   中英

使用forEach在Q中順序執行函數

[英]Using forEach to sequentially execute functions in Q

我正在嘗試使用他們的第一個序列策略來運行基於Q API的一系列函數。 這表明了這種模式:

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

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

數組中每個函數的結構是什么? 關於何時使用return def.promise;我很困惑return def.promise; 那簡直就是最后一行嗎? 是經常還是總是緊跟def.resolve(someVar) 這樣的事情結束了嗎?

function foo(f){
    var def =  Q.defer();
    f++;
    def.resolve(f);
    return def.promise;
}

這樣,數組中的每個后續函數都將接收新計算的f值:在這種情況下,如果var initialVal = 1; 和四個函數每個遞增f++ ,返回的結果將是4 如何訪問返回的值? console.log(result)打印{ state: 'pending' }

數組中每個函數的結構是什么?

Q.js允許以多種方式創建承諾。 例如 :

function foo(value) {
    var def =  Q.defer();
    def.resolve(value + 1);
    return def.promise;
}

function foo(value) {
    return Q(value + 1);
}

function foo(value) {
    return Q.Promise(function(resolve, reject) {
        resolve(value + 1);
    });
}

其他Promise庫類似,但不一定非常靈活。 原生js Promises必須使用這些方法中的第三種來構建。

但是,在現實世界中,您很少需要創建自己的Promise。 您通常會處理其他人編寫的promise-returns lib方法。 例如 :

function foo(value) {
    return lib.doSomethingAsync(value, and, other, params);
}

如何訪問返回的值?

如果成員名稱“result”替換為“promise”,則代碼更容易理解,而result.then(f)則使用調用f()的匿名函數重寫。

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

這100%等同於問題中的代碼,但現在應該更清楚地知道先前的結果如何沿着promise鏈傳遞。

在序列中訪問所有先前的承諾結果更復雜。 這里的答案全面地討論了這個主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM