我正在做类似这样的事情,其中第一个函数依赖于第二个。
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(){})
答案 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));
我认为这很干净。