Node.js 在循环中添加到对象
Node.js adding to an object within a loop
我好像想不通。我使用 Node、Express 和 Bluebird 来实现承诺。我想要做的是在一个循环中添加一个对象。当我控制日志时,我得到一个空对象。
我是不是做错了?
Promise.props({
rewards: db.query("SELECT title, created_by FROM rewards WHERE team_id = '" + team_id + "'")
}).then(function(results) {
var rewards = [],
title = results.rewards[0].title;
created_by = results.rewards[0].created_by,
for (var i = 0; i < results.rewards.length; i++) {
Promise.props({
user: db.query("SELECT * FROM users WHERE uid = '" + results.rewards[i].created_by + "'")
}).then(function(result) {
rewards.push({
created_by: created_by,
title: title,
username: result.user[0].username
});
});
}
console.log(rewards);
});
您正在尝试在工作完成之前控制日志。您需要先等待嵌套的承诺循环完成。
为此,将所有承诺收集到一个数组中并使用 Promise.all
知道它们何时全部完成
var promiseList = [];
for (var i = 0; i < results.rewards.length; i++) {
// hold the promise in a variable
var p = Promise.props({
user: db.query("SELECT * FROM users WHERE uid = '" + results.rewards[i].created_by + "'")
}).then(function(result) {
rewards.push({
created_by: created_by,
title: title,
username: result.user[0].username
});
// collect the promise
promiseList.push(p);
}
// wait for all of them to finish
Promise.all(promiseList).then(function(){
console.log(rewards);
});
我好像想不通。我使用 Node、Express 和 Bluebird 来实现承诺。我想要做的是在一个循环中添加一个对象。当我控制日志时,我得到一个空对象。
我是不是做错了?
Promise.props({
rewards: db.query("SELECT title, created_by FROM rewards WHERE team_id = '" + team_id + "'")
}).then(function(results) {
var rewards = [],
title = results.rewards[0].title;
created_by = results.rewards[0].created_by,
for (var i = 0; i < results.rewards.length; i++) {
Promise.props({
user: db.query("SELECT * FROM users WHERE uid = '" + results.rewards[i].created_by + "'")
}).then(function(result) {
rewards.push({
created_by: created_by,
title: title,
username: result.user[0].username
});
});
}
console.log(rewards);
});
您正在尝试在工作完成之前控制日志。您需要先等待嵌套的承诺循环完成。
为此,将所有承诺收集到一个数组中并使用 Promise.all
知道它们何时全部完成
var promiseList = [];
for (var i = 0; i < results.rewards.length; i++) {
// hold the promise in a variable
var p = Promise.props({
user: db.query("SELECT * FROM users WHERE uid = '" + results.rewards[i].created_by + "'")
}).then(function(result) {
rewards.push({
created_by: created_by,
title: title,
username: result.user[0].username
});
// collect the promise
promiseList.push(p);
}
// wait for all of them to finish
Promise.all(promiseList).then(function(){
console.log(rewards);
});