【问题标题】:Using Async inside another function [duplicate]在另一个函数中使用异步[重复]
【发布时间】:2017-05-24 20:11:45
【问题描述】:

我正在使用 node.js 并与sails.js 框架异步。 我正在尝试创建一个对数据数组执行一些异步 DB 操作的函数,但我无法找到一种简单的方法将异步结果返回给父函数。 这是我的代码:

convertProductfields: function (articlesFromAurelia){

    async.each(articlesFromAurelia, function (post, cb) {
      Categories.find({name: post.Categoria})
        .then(function(category){

          post.cat_id = category[0].cat_id;              
          cb();
        })
        .fail(function(error){
          cb(error);
        })
    }, function(error){
      if(error) return res.negotiate(error);

      sails.log.debug('articlesFromAureliaModified ' , articlesFromAurelia);
      return articlesFromAurelia;
    });

    sails.log.debug('articlesFromAureliaNotModified ' , articlesFromAurelia);
    return articlesFromAurelia;
}

问题当然是代码的执行顺序。当异步操作的结果可用时,我的函数已经返回......那么,如何使它工作?谢谢!!

【问题讨论】:

  • 删除最后两行。并将回调传递给convertProductfields

标签: javascript node.js asynchronous sails.js


【解决方案1】:

使用 Node 6.0,可以使用内置的 Promises。

convertProductfields: function (articlesFromAurelia){

    var allPromises = articlesFromAurelia
                      .map(post => new Promise((resolve, reject) => {
                               Categories.find({name: post.Categoria})
                                .then((category) => resolve(category))
                                .fail((error) => reject(error))
                               }));
    return Promise.all(allPromises);
}

而要使用上面的功能,

convertProductfields(articlesFromAurelia)
  .then(() =>{
       //handle success
  }).catch(() => {
       //handle error
  })

【讨论】:

    【解决方案2】:

    希望对你有帮助。

    convertProductfields: function (articlesFromAurelia, callback){
    
      async.each(articlesFromAurelia, function (post, cb) {
        Categories.find({name: post.Categoria})
          .then(function(category){
            post.cat_id = category[0].cat_id;
            cb();
          })
          .fail(function(error){
            cb(error);
          })
      }, function(error){
        if(error) 
          return callback(null);  //incase of error, return null
    
        sails.log.debug('articlesFromAureliaModified ' , articlesFromAurelia);
        return callback(articlesFromAurelia);  //return updated articles
      });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多