在Javascript中实现Promise.chain([…])?
简短问题:为什么Javascript中没有Promise.chain(与Promise.all相当)?我的实施是否正常? 我的“编解码器”行为错误:在Javascript中实现Promise.chain([…])?,javascript,es6-promise,Javascript,Es6 Promise,简短问题:为什么Javascript中没有Promise.chain(与Promise.all相当)?我的实施是否正常? 我的“编解码器”行为错误: 从XML文件读取图形 创建所有节点(创建方法返回承诺) 正在等待所有节点创建完成 在节点之间创建所有边 问题是:在执行时,创建节点(步骤2)的数据库调用顺序混乱 解决方案:在执行方法之前,我必须以正确的顺序链接数据库调用 /** * chains a list of functions (that return promises) and exe
/**
* chains a list of functions (that return promises) and executes them in the right order
* [function() {return Promise.resolve();}, function() {return Promise.resolve();}]
*
* @param funcs is an array of functions returning promises
* @returns {Promise}
*/
function chain_promises(funcs) {
if (funcs.length < 1) {
return Promise.resolve();
}
var i = 0;
return chain_executor(funcs, i);
}
/**
* Recursive help method for chain_promises
* 1) executes a function that returns a promise (no params allowed)
* 2) chains itself to the success resolve of the promise
*
* @param funcs is an array of functions returning promises
* @param i is the current working index
*/
function chain_executor(funcs, i) {
var promise = funcs[i]();
return promise.then(function(){
console.log(i);
if (funcs.length > i+1) {
return chain_executor(funcs, i+1);
} else {
return Promise.resolve();
}
})
}
/**
*链接函数列表(返回承诺)并按正确顺序执行它们
*[函数(){return Promise.resolve();},函数(){return Promise.resolve();}]
*
*@param funcs是返回承诺的函数数组
*@returns{Promise}
*/
功能链(funcs){
如果(函数长度<1){
返回承诺。解决();
}
var i=0;
返回链执行器(funcs,i);
}
/**
*链的递归帮助方法
*1)执行返回承诺的函数(不允许使用参数)
*2)将自己束缚在承诺的成功上
*
*@param funcs是返回承诺的函数数组
*@param i是当前的工作索引
*/
函数链执行器(funcs,i){
var promise=funcs[i]();
return promise.then(函数(){
控制台日志(i);
如果(函数长度>i+1){
返回链执行器(funcs,i+1);
}否则{
返回承诺。解决();
}
})
}
使用数组#reduce可以创建此函数
const chain_promises = arrayOfFn => arrayOfFn.reduce((promise, fn) =>
promise.then(results =>
fn().then(result =>
results.concat(result)
)
), Promise.resolve([])
);
或者如果你喜欢一句台词
const chain_promises = arrayOfFn => arrayOfFn.reduce((promise, fn) => promise.then(results => fn().then(result => results.concat(result))), Promise.resolve([]));
它们还有一个额外的好处,即解析的值都可以在中找到
e、 g
const chain\u promises=arrayOfFn=>arrayOfFn.reduce((promise,fn)=>
承诺。然后(结果=>
fn()。然后(结果=>
结果:concat(结果)
)
),Promise.resolve([])
);
const wait_promise=(时间,结果)=>new promise(解析=>setTimeout(解析,时间,结果));
var funcs=[
()=>wait_promise(300,'p1')。然后(value=>({value,date:new date()})),
()=>wait_promise(400,'p2')。然后(value=>({value,date:new date()})),
()=>wait_promise(100,'p3')。然后(value=>({value,date:new date()}))
];
const start=新日期();
连锁店承诺(funcs)
。然后(结果=>
结果.减少((a,b)=>{
console.log(b.value,b.date-a);
返回b.日期;
},开始)
);代码>传递空数组时(我想)会中断。你说得对!这里要包括一张支票。感谢可能的副本