从代码底部的return语句看来,您似乎还没有完全掌握node.js的异步本质。代码中的return语句将在第一次调用sequelize.query(即查询返回之前)后直接执行。这意味着用户将是未定义的。
如果你想真正“回归”的用户和他们的利益,我建议是这样的:
sequelize.query("SELECT * FROM users").success(function(users) {
done = _.after(users.length, function() {
callback(users)
})
for (var u in users) {
sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).success(function(interests) {
if (interests.length > 0) {
users[u].interests = interests;
}
done();
});
}
});
在上面_
代码指的是实用库。该函数在调用users.length次之后执行回调函数。回调是一个传递给你的代码片段的函数,它应该处理返回的结果,例如在Web服务器上下文中将用户返回给客户端。
另一个评论 - 如果你只是在做原始SQL查询,Sequelize可能不是你的最佳选择。你为什么不直接使用SQL驱动程序的原因?如果你想使用sequelize,你应该利用它的功能。尝试将定义用户和兴趣的模型,建立一个协会,并使用JOINs/eager loading
更新加载用户和利益一气呵成:的使用承诺
sequelize.query("SELECT * FROM users").then(function(users) {
return sequelize.Promise.map(users, function (u) {
return sequelize.query("SELECT interests.id, interests.title FROM interests, user_interests WHERE interests.id = user_interests.interest_id AND user_interests.user_id = " + users[u].id).then(function(interests) {
if (interests.length > 0) {
user.interests = interests;
}
});
});
});
例如只要记住,你必须包括[下划线](https://npmjs.org/package/underscore)模块 – josemando
_已被用于续集,并通过'Sequelize.Utils._'公开 –
嗨Jan 我在同一个问题上被阻止了很多个小时。我尝试使用Promise.all没有任何运气。我是新来的node.js和所有异步的东西,所以我很困惑,但我想知道你是否有一个使用Promise.all的工作示例?谢谢 在任何情况下,你的答案工作,并帮助我很多。 – Etienne