從代碼底部的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