Javascript 使用蓝鸟的承诺依赖

Javascript 使用蓝鸟的承诺依赖,javascript,concurrency,promise,bluebird,Javascript,Concurrency,Promise,Bluebird,我想并行运行异步事件的动态列表,其中一些事件需要先完成其他事情,然后才能访问所有聚合结果。到目前为止,我提出了通过多维迭代的方法。操作数组,但它需要包装函数/闭包,所以我对它不太满意。我想知道还有其他人在为这种情况做什么 var runAllOps = function(ops) { var all = []; // counter for results var runOperations = function runOperations(ops) { var

我想并行运行异步事件的动态列表,其中一些事件需要先完成其他事情,然后才能访问所有聚合结果。到目前为止,我提出了通过多维迭代的方法。操作数组,但它需要包装函数/闭包,所以我对它不太满意。我想知道还有其他人在为这种情况做什么

var runAllOps = function(ops) {
    var all = []; // counter for results

    var runOperations = function runOperations(ops) {
        var set = ops.shift();
        return Promise.map(set, function(op){
            return op.getData.call(null, op.name)
        })
        .then(function(results){
            all.push(results)
            if (ops.length){
                return runOperations(ops)
            } else {
                return _.flatten(all)
            }
        })
    }

    return runOperations(ops)
}
操作如下所示:

var operations = [
    [
        {name: 'getPixieDust', getData: someAsyncFunction},
        {name: 'getMandrake', getData: etc},
    ],
    [
        {name: 'makePotion', getData: brewAsync}
    ]   
] 
有什么好方法可以用承诺映射依赖关系吗?如果能够做到以下几点,那就太好了:

makePotion: [getPixieDust, getMandrake]

然后将整个过程传递给知道getPixieDust和getMandrake在调用makePotion之前首先完成的人。目前,在Bluebird或我所知的任何其他promise库中,都没有自动执行的方法,而不是将依赖操作放在后面的数组中。简单地说,您可以通过自己构建树来实现这一点

以下是我如何处理这个问题。首先,让我们缓存结果:

var pixieDustP = null;
function getPixieDust(){
    return pixieDustP || (pixieDustP = apiCallReturningPromise());
}

var mandrakeP = null;
function getMandrake(){
    return mandrakeP || (mandrakeP = apiCallReturningPixieDustPromise());
}

function makePotion(){
    return Promise.join(getMandrake(),getPixieDust(),function(dust,mandrake){
        // do whatever with both, this is ok since it'll call them both.
        // this should also probably be cached.
    });
}

我们实际上已经讨论过在过去使用getter向Bluebird添加类似的内容。下面是我要做的-如果makePotion上的getData需要getPixieDust上的getData-让getPixieDust调用makePotion上的承诺并缓存它。谢谢,看起来不错。我的例子中唯一的问题是“成分列表”可能是动态生成的。当您想在某个地方动态添加一个新的依赖项时,您对这种情况有何想法?就像在我的原版中一样,我只是向数组中添加了新的操作,其余的代码也保持不变-您能详细说明缓存的需要吗?如果你有任何关于添加类似于蓝鸟的git讨论的链接,我也想看看。谢谢您可以使用.all而不是.join.join.join.join速度更快,而且可以使用.all[...spread,如果InCreditant列表是动态的,您当然可以使用.all。动态添加依赖项只是简单的操作。我没有在IRC上讨论git,最近的一次讨论是,但没有太多的上下文:谢谢你的工作,很好的材料可以查看但是我仍然不清楚为什么要缓存结果。哦,这项工作主要是读所有的Petka。缓存结果只是为了防止每个承诺都是多个承诺的依赖项,因此您不希望每次都进行几个API调用—您的里程可能会有所不同。