bluebird中是否有任何类似async.waterfall的方法

时间:2017-04-15 07:31:38

标签: javascript node.js bluebird

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

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新承诺( ES6

我的问题是 -  1.如何在Bluebird promise库中解决这个问题(按顺序,如果一个函数依赖于其他函数),如

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

1 个答案:

答案 0 :(得分:0)

您可以使用蓝鸟Promise.reduce或创建自己的瀑布)功能,例如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));

我认为这很干净。