簡體   English   中英

藍鳥對功能數組的承諾

[英]Bluebird promise on array of functions

我有一個需要從JSON文件讀取的函數數組: "functionArray" : ["task1()", "task2()", ... , "taskN()"]

我的要求是依次調用這些任務,以便僅在task1函數成功執行后才調用task2函數。 使用這些功能的包裝器將具有功能定義。


function task1(){ console.log('Inside task1'); }

function task2(){ console.log('Inside task2'); }

var functionArrayToBeUsed = readFromJson(functionArray);

\\\\functionArrayToBeUsed has all tasks that need to be finished


什么是使用Promises做到這一點的理想方法。

假設以以下形式提供JSON ...

"functionArray" : ["task1", "task2", ... , "taskN"]

...以及要成為tasks對象屬性的tasks ...

var tasks = {
    task1: function () {
        console.log('Inside task1');
    },
    task2: function () {
        console.log('Inside task2');
    }
};

...然后您可以執行以下操作。

同步任務

var functionArray = readFromJson(functionArray);
functionArray.reduce(function(previousResult, taskName) {
    return tasks[taskname](previousResult);
}, null);

異步(或混合)任務

var functionArray = readFromJson(functionArray);
functionArray.reduce(function(p, taskName) {
    return p.then(tasks[taskname]);
}, Promise.resolve());

在這兩種情況下,數組方法.reduce()提供了一種構建.then()鏈的緊湊方法,並帶有可解決的承諾以使事情開始。

這些示例為您提供了超出要求的范圍。 在每種方法中,結果都將從每個函數傳遞到下一個函數。 如果函數不接受任何參數,則此功能不會有任何危害。

也就是說,如果任何函數可能返回undefined ,那么所有內容都需要進行防御性編碼。

像這樣的東西(未經測試):

function callSequentaly(promises) {
    var values = [];
    var newPromises = [];

    function makeSequence(prevPromise, nextPromise) {
        return prevPromise.then(function (value) {
            values.push(value);
            return nextPromise;
        });
    }

    newPromises.push(promises[0]);
    for (var i = 1; i < promises.length; i++) {
        newPromises.push(makeSequence(newPromises[i - 1], promises[i]));
    }

    var defer = Promise.defer();

    Promise.all(newPromises)
        .then(function () { defer.resolve(values) })
        .catch(function (e) { defer.reject(e) });

    return defer.promise;
}

暫無
暫無

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

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