2017-04-15 13 views
1

我正在做这样的事情,其中​​第一个函数依赖于第二个函数。是否有任何蓝鸟的方法,它的工作原理就像async.waterfall

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承诺库,如果一个函数解决这个问题(在顺序是依赖于其他)等

async.waterfall([ 
function(){}, 
function(){}], 
function(){}) 
  • 此处2个承诺创建。是没有什么办法
  • +0

    什么是*数据*?它没有价值... – trincot

    +0

    我认为你可以做到async.waterfall通过使用承诺的目的,没有额外的复杂性。 ()。然后(b)。然后(c).catch(...)' – elpddev

    回答

    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)); 
    

    我认为这很干净。

    +0

    你不这么认为promise.reduce会像'async.each'那样工作?在其中它接受一个元素并为其执行...然后选择其他并为其他执行相同的操作..我想为不同的功能执行独特的操作 – hardy

    +0

    'promise.reduce'可以接受一组promise并在执行后执行一个另一个。文档说:*如果reducer函数返回一个promise,那么在继续下一次迭代之前,这个promise的结果是等待的。*为了理解你的问题,这正是你想要的。 – trincot

    相关问题