如何在每个函数返回deferred.promise时链接函数数组的执行?
我已经在Node.js中使用延迟模块创build了我的第一个延迟对象,当我将结果传递给下一个函数并触发parsing和拒绝时,它工作的很好。当每个函数返回deferred.promise时,如何链接执行函数数组? 我有第一个函数的函数和input参数的input参数数组,每个下一个函数从前一个获取参数。
它的作用就像f1(100).then(f2).then(f3)
,但是当我有n个函数的时候。
您需要在循环中构build一个承诺链:
var promise = funcs[0](input); for (var i = 1; i < funcs.length; i++) promise = promise.then(funcs[i]);
同样的想法,但你可能会发现它稍微更分类或更紧凑:
funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
如果你没有特定的starting_promise
你想使用,只需使用Promise.resolve()
。
build立在@torazaburo,我们也可以添加一个'不快乐的path'
funcs.reduce(function(prev, cur) { return prev.then(cur).catch(cur().reject); }, starting_promise);
ES6,允许其他参数:
function chain(callbacks, initial, ...extraArgs) { return callbacks.reduce((prev, next) => { return prev.then((value) => next(value, ...extraArgs)); }, Promise.resolve(initial)); }
对于可能的空数组:
var promise = $.promise(function(done) { done(); }); funcs.forEach(function(func) { promise = promise.then(func); });
ES7的方式在2017年。http://plnkr.co/edit/UP0rhD? p= preview
async function runPromisesInSequence(promises) { for (let promise of promises) { console.log(await promise()); } }
这将按顺序(逐个)执行给定的function,而不是并行执行。 参数promises
是一个函数集合(NOT Promise
),它返回Promise
。