【问题标题】:Attaching data from callback function inside a for loop Loopback在 for 循环内从回调函数附加数据 Loopback
【发布时间】:2016-06-07 06:27:02
【问题描述】:

我正在尝试创建一个钩子,在其中循环响应的每个结果,根据当前对象查找用户并将其作为另一个属性附加到最终响应。但是,异步调用并没有让我发送正确的响应:

  Board.afterRemote('find',function(context,boards,next){
    var users = [];
    context.result.admin =[];
    var User = app.models.User;


    context.result.forEach(function(result){
      User.findOne({where:{id:result.adminId}},function(err,user){
        result.admin = user;
      });

    });
    console.log("result: "+JSON.stringify(context.result));
    next();

  });

我怎样才能将用户添加到 context.result 上的每个结果中?

【问题讨论】:

    标签: javascript node.js loopback


    【解决方案1】:

    User.findOne和异步操作吗?如果是这样,我建议使用像 async 这样的异步控制流库来迭代结果并对每个项目执行异步操作。它看起来像这样:

    Board.afterRemote('find',function(context,boards,next){
        async.each(context.result, function(result, callback) {
            User.findOne({where:{id:result.adminId}},function(err,user){
              result.admin = user;
              callback(err) // Done with this iteration
            });
        }, function(err) { // Called once every item has been iterated over
            console.log("result: "+JSON.stringify(context.result));
            next();
        });
    });
    

    【讨论】:

    • 感谢您的回答! find 确实是一个异步操作。我还有一个问题。我还需要在 afterRemote 回调结束时调用 next() 函数吗?还是只是在 async.each() 的 cb 中才有必要?
    • async.each 完成后,您可能需要致电 next。传递给迭代器的回调让 async 知道此迭代已完成。一旦所有迭代完成,您传递给 async.each 的回调就会被调用。那是你接下来要调用的地方,因为那是所有迭代都完成的时候。 async.each(collection, iterator, callback) 我已经更新了答案以显示它在 afterRemote 回调中的外观。
    猜你喜欢
    • 2021-05-28
    • 2020-08-27
    • 2016-12-19
    • 2019-04-12
    • 2019-08-07
    • 2013-12-11
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多