蓝鸟承诺的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; }