在Javascript中实现Promise.chain([…])?

在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

简短问题:为什么Javascript中没有Promise.chain(与Promise.all相当)?我的实施是否正常?

我的“编解码器”行为错误:

  • 从XML文件读取图形
  • 创建所有节点(创建方法返回承诺)
  • 正在等待所有节点创建完成
  • 在节点之间创建所有边
  • 问题是:在执行时,创建节点(步骤2)的数据库调用顺序混乱

    解决方案:在执行方法之前,我必须以正确的顺序链接数据库调用

    /**
     * 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.日期;
    },开始)
    
    );传递空数组时(我想)会中断。你说得对!这里要包括一张支票。感谢可能的副本