javascript - sails.js 使用 async.js 查找每个并行调用的查询 - 每个都提前返回

标签 javascript sails.js waterline async.js

sails v0.11.0 ( http://sailsjs.org/ )

我曾尝试使用 .exec 回调、promises ( http://sailsjs.org/documentation/reference/waterline-orm/queries ) 和现在的 async.js ( https://github.com/caolan/async ) 来控制围绕查找查询循环的异步流程,但没有成功。 async.each 日志输出中没有并行工作(尽管并行确实填充)。

因此,如果您的解决方案可以使用 .exec 回调、promises 或 async.js - 我会很乐意接受它!

我发现此链接提供了一些有用的 async.js 示例 ( http://www.sebastianseilund.com/nodejs-async-in-practice )

感谢您的时间和帮助。

下面是我使用异步的代码:

/**
 * @module      :: Service
 * @type {{findProfile: Function}}
 */

require('async');

module.exports = {
  getProfile: function (userId, callback) {
    var json = {};
    json.notFound = false;
    json.locations = {};
    json.sports = {};

    User.findOne({id: userId}).exec(function (err, user) {
      if (err) {
        json.notFound = true;
        json.err = err;
      }

      if (!err) {
        json.user = user;

        UserSport.find({user_id: user.id}).exec(function (err, userSports) {
          if (err) {
            sails.log.info("userSports error: " + userSports);
          }

          async.each(userSports, function (userSport, callback) {
            LocationSport.findOne({id:userSport.locationsport_id}).exec(function (err, locationSport) {
              if (locationSport instanceof Error) {
                sails.log.info(locationSport);
              }

              async.parallel(
                [
                  function (callback) {
                    Location.findOne({id:locationSport.location_id}).exec(function (err, location) {
                      if (location instanceof Error) {
                        sails.log.info(location);
                      }
                      callback(null, location);
                    });
                  },
                  function (callback) {
                    Sport.findOne({id:locationSport.sport_id}).exec(function (err, sport) {
                      if (sport instanceof Error) {
                        sails.log.info(sport);
                      }
                      callback(null, sport);
                    });
                  }
                ],
                function (err, results) {
                  if (!(results[0].id in json.locations)) {
                    json.locations[results[0].id] = results[0];
                  }

                  if (!(results[1].id in json.sports)) {
                    json.sports[results[1].id] = results[1];
                  }
                }
              ); // async.parallel

            }); // locationSport
            callback();
          }, function (err) {
            sails.log.info('each');
            sails.log.info(json);
          }); // async.each

        }); // UserSport
      }
    }); // User
  }

}

最佳答案

您的代码结构如下:

      async.each(userSports, function (userSport, callback) {

        // Whatever happen here, it runs asyncly

        callback();
      }, function (err) {
        sails.log.info('each');
        sails.log.info(json);
      }); // async.each

您正在调用回调方法,但对您的数据的处理尚未完成(它正在异步运行)。结果,sails.log.info 被立即调用。

您应该修改您的代码,以便在流程完成后调用回调。即在您的 async.parallel 的结果中:

      async.each(userSports, function (userSport, outer_callback) {
        LocationSport.findOne({id:userSport.locationsport_id}).exec(function (err, locationSport) {
          //...
          async.parallel(
            [
              function (callback) {
                // ...
              },
              function (callback) {
                // ...
              }
            ],
            function (err, results) {
              // ...

              outer_callback();

            }
          ); // async.parallel

        }); // locationSport

      }, function (err) {
        sails.log.info('each');
        sails.log.info(json);
      }); // async.each

关于javascript - sails.js 使用 async.js 查找每个并行调用的查询 - 每个都提前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31893062/

相关文章:

node.js - Sails.js - 使用多重连接获取对象(模型)

javascript - 创建新用户时未调用 beforeCreate 方法

node.js - 更改 CreatedAt/UpdateAt 属性的字段名称

javascript - Camelcase 在 Javascript 中使用 split() 两次

javascript - JavaScript代理模式介绍

android - 保护 Sails API

node.js - Sails Waterline 大文件 PostgreSQL

javascript - 使用来自前端的 Oauth 密码流程进行身份验证

Javascript onClick 事件无法登录控制台

Sails.js 和复数关系数据库表名