【问题标题】:is there any method in bluebird which works like async.waterfall蓝鸟中有没有像 async.waterfall 一样工作的方法
【发布时间】:2017-04-15 07:31:37
【问题描述】:

我正在做这样的事情,其中​​第一个函数依赖于第二个。

let findOrg = () => {
    return new Promise((resolve, reject) => {
        db.organization.find({
                where: data
            })
            .then(org => {
                return resolve(org);
            }).catch(err => {
                reject(err);
            });
    }); };

let createOrg = org => {
    return new Promise((resolve, reject) => {
        if (org) {
            return resolve(org);
        }
        db.organization.build(data)
            .save()
            .then((org) => {
                return resolve(org);
            }).catch(err => {
                reject(err);
            });
    }); };

findOrg()
    .then(org => { //going to find org
        return createOrg(org); //then going to make org
    }).then(newOrg => {
        res.data(mapper.toModel(newOrg)); //then mapping
    }).catch(err => {
        return res.failure(err);
    });

在上述函数 findOrg 和 createOrg 中创建了新的 promise (ES6)

我的问题是—— 1. 我们如何在Bluebirdpromise 库中解决这个问题(如果一个函数依赖于另一个函数,则按顺序),如

async.waterfall([
function(){},
function(){}],
function(){})
  1. 这里创建了 2 个承诺。我有什么办法吗

【问题讨论】:

  • 什么是数据?它没有被赋予价值......
  • 我认为你可以通过按预期使用承诺来完成 async.waterfall 所做的事情,而无需额外的复杂性。 a().then(b).then(c).catch(...)

标签: javascript node.js bluebird


【解决方案1】:

您可以使用 bluebird 的 Promise.reduce 或创建自己的 waterfall (chain) 函数,如 this 作为替代。

但是:您的代码在使用promise constructor antipattern 时会产生不必要的开销:您可以不使用new Promise 来编写它,而使用.bind 您还可以避免显式创建内联函数,...像这样:

let findOrg = () => db.organization.find({where: data});

let createOrg = org => org || db.organization.build(data).save();

findOrg()
    .then(createOrg)
    .then(mapper.toModel.bind(mapper))
    .then(res.data.bind(res))
    .catch(res.failure.bind(res));

在我看来这很干净。

【讨论】:

  • 你不这么认为 promise.reduce 会像async.each 一样工作??其中它需要一个元素并为其执行..然后选择其他元素并为其他元素执行相同的执行..我想要不同功能的独特执行
  • promise.reduce 可以接受一组承诺,并一个接一个地执行它们。文档说:如果reducer 函数返回一个promise,那么在继续下一次迭代之前等待promise 的结果。根据我对你的问题的理解,这正是你想要的。跨度>
猜你喜欢
  • 2015-04-13
  • 2017-05-27
  • 1970-01-01
  • 2015-11-26
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多