【问题标题】:Nodejs mixed async functions and promisesNodejs 混合了异步函数和 Promise
【发布时间】:2015-10-12 20:50:53
【问题描述】:

所以我有带有一些帮助服务的sails 应用程序,可以更轻松地创建和获取复杂的模型。 其中一项是

getMerits: function(profileId, limit){
return async.waterfall([
  function(callback){
    Merit.find({employeeProfile: profileId}).then(function(merits){
      callback(null, merits);
    });
  },
  function(merits, callback){
    async.forEach(merits, function(item, loop_callback){
      MeritIndex.findOne({id: item.index}).then(function(meritIndex){
        merits[merits.indexOf(item)].index = meritIndex;
        loop_callback();
      });
    }, function(err, results){
      callback(null, merits);
  });
  }
], function(err, results){
  return results;
});

}

问题是当我尝试调用此函数来获取结果时(插入了它们的优点索引的优点列表。)我无法找出从异步瀑布返回结果的正确方法:

async.forEach(profiles, function(item, loop_callback){
      MeritService.getMerits(item.id, 5).exec(function(err, merits){
        console.log(merits)
        profiles[profiles.indexOf(item)].merits = merits;
        loop_callback();
      });
      // MeritService.getMerits(item.id, 5).exec(function(m){
      //   console.log(m)
      //   profiles[profiles.indexOf(item)].merits = m;
      //   loop_callback();
      // });
    }, function(err){
        console.log("PROFILES" + JSON.stringify(profiles))
    });

这里的优点打印结果未定义。有没有办法将异步瀑布视为一个承诺并使用 then 而不是 exec?

【问题讨论】:

    标签: node.js asynchronous sails.js waterline


    【解决方案1】:

    您不需要使用async.waterfall,因为您已经有了承诺、承诺链——因此为该逻辑添加另一个库是多余的。 Waterline 使用了带有便利方法的 bluebird promise。

    你的 getMerits 可以写成:

    getMerits: function(profileId, limit){
      var merits = Merit.find({employeeProfile: profileId}); 
      var items = merits.map(function(item) {
        return MeritIndex.findOne({id: item.index }).then(function(meritIndex) {
          item.index = meritIndex;
        });
      });
      return items.return(merits); // wait for items to be done, and return the merits
    }
    

    附: 如果您使用 Node 4+,请告诉我,因为它变得更加简单。

    【讨论】:

    • 我很好奇 node 4+ 中这种更简单的用法
    • 谢谢,看起来好多了。我很好奇节点 4 如何更好地做到这一点,而且。使用 getMerits 函数的正确方法是什么?作为习惯使用python的人,我发现这非常令人困惑。如果我尝试将返回值放在一个变量中,它会导致 null,如果我尝试像以前一样使用它,它会显示 Cannot read property 'exec' of undefined
    • var items = merits.map(function(item) { 行给出了错误Unhandled rejection TypeError: undefined is not a function
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2019-01-23
    • 2019-05-31
    • 2017-01-09
    • 2020-05-31
    • 2021-06-28
    相关资源
    最近更新 更多