node.js如何处理回调中对象和变量的更改

时间:2013-07-25 08:00:51

标签: javascript node.js callback

我刚刚开始使用node.js开展一个大项目,我偶然发现了一些回调噩梦问题。我以前做过一些node.js开发,但只是基于教程的小东西。

我有一个用户模型和一个所有者模型,谁是该用户的所有者...基本上我在node.js中构建的部分将是一个REST服务,所以我需要发送一个包含用户的json,它是所有者名称。我的问题是试图获得所有者的名字,就像我会在ruby或php中做它并将其设置为属性..但它不起作用。

人们如何处理node.js中需要更改回调函数中对象的逻辑?我也不希望它影响性能。

我使用mysql作为数据库,因为这是一个要求。所以代码是这样的:

//find all 
req.models.users.find({
    'id' : req.query.id
}, function(err, users) {
    if (err) console.log(err); //do something better here
    else {
        var json = [];
        users.forEach(function(user) {
            user.getOwner(function(err, owner) {
                user.accountOwner = owner.name;

                json.push(user;
            });    
        });

        res.type('application/json');
        res.send(json);
    }
});

我想发送这样的内容:     [{         'id':user.id,         'username':user.username,         'email':user.email,         'owner':user.owner.name'     },     {...}]

1 个答案:

答案 0 :(得分:1)

问题是你不了解节点代码的控制流程。它不按时间顺序从上到下逐行排列。所以你的问题是res.send(json)在你的user.getOwner回调执行之前(及时)发生,所以你发送空的json,然后你已经发送了东西到json数组中。您需要使用async.each之类的东西来进行连接,等待所有用户的所有者填充,然后发送响应。或者您实际上可以通过编写SQL连接而不是对数据库执行N + 1查询来让数据库加入数据。