【问题标题】:Promise Dependency using Bluebird使用 Bluebird 的承诺依赖
【发布时间】:2018-03-16 00:06:32
【问题描述】:

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

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 添加类似的东西(使用 getter)。这就是我要做的 - 如果 makePotion 上的 getData 需要 getPixieDust 上的 getData - 让 getPixieDust 在 makePotion 上调用承诺本身并缓存它。

标签: javascript concurrency promise bluebird


【解决方案1】:

目前在 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.
    });
}

【讨论】:

  • 谢谢,看起来不错。唯一的事情(我的例子在这里分解)是“成分列表”可能是动态的 - 使 .join 有问题。当您想在某处动态添加新依赖项时,对于这种情况有什么想法吗? (就像在我的原始文件中一样,我只需向数组添加新的操作,其余代码不变)另外,您能否详细说明缓存的必要性?如果您有任何关于添加类似于 bluebird 的 git 讨论的链接,我也很乐意查看。谢谢!!!!
  • 您可以使用.all 代替.join 那里,.join 更快并且使用.all([..]).spread,如果成分列表是动态的,您当然可以使用.all 代替。动态添加依赖项只是.thening 它。我没有在 IRC 上讨论过的 git 讨论,我最接近的是 gist.github.com/petkaantonov/ff78fed43146e33a0657,但没有很多上下文:)
  • 感谢您的工作,很好的材料值得一看。 :D 但我仍然不清楚为什么要缓存结果。
  • 哦,这项工作主要是(阅读全部)Petka。缓存结果是为了以防每个 Promise 都依赖于多个 Promise,因此您不希望每次都进行多次 API 调用 - 您的里程可能会有所不同。
猜你喜欢
  • 2016-07-27
  • 2014-11-11
  • 2018-02-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2014-09-07
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多