[英]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.