蓝鸟承诺的functionarrays
我有一个需要从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
什么将是一个理想的方式来做到这一点使用承诺。
假设JSON以表单forms提供…
"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);
asynchronous(或混合)任务
var functionArray = readFromJson(functionArray); functionArray.reduce(function(p, taskName) { return p.then(tasks[taskname]); }, Promise.resolve());
在这两种情况下,数组方法.reduce()
提供了一个紧凑的方式来build立一个.then()
链,种子与一个解决的承诺,让事情开始。
这些例子给你比你要求的更多。 在每种方法中,结果都从每个函数传递到下一个函数。 如果这些function不接受任何参数,那么这个function将不会造成任何伤害。
也就是说,如果任何一个函数可能返回undefined
,那么所有的东西都需要更多的防御编码。
像这样(未testing):
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; }