2016-03-22 2 views
0

Я не могу понять это. Я использую Node, Express и Bluebird для обещаний. То, что я пытаюсь сделать, это добавить к объекту в цикле. Когда я консольный журнал, я получаю пустой объект.Node.js, добавляющий к объекту в цикле

Я все об этом не так?

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({ 
 
\t   created_by: created_by, 
 
\t   title: title, 
 
\t   username: result.user[0].username 
 
      }); 
 
     }); 
 
    } 
 
    console.log(rewards); 
 
});

ответ

2

вы пытаетесь утешить войти до того, как работа была завершена. вам нужно дождаться завершения вложенного цикла обещаний.

Чтобы сделать это, собрать все обещания в массив и использовать 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); 
}); 
+0

Спасибо, Дерик! Я внес свои изменения и получаю эту ошибку: 'Unhandled rejection TypeError: ожидающий массив или итерируемый объект, но получивший [объект Null]' – twobergs

+0

oops - там было несколько опечаток. Я обновил код, чтобы исправить вызов Promise.all и орфографию «promList». надеюсь, он будет работать сейчас –

+0

Это сработало. Спасибо за вашу помощь! – twobergs

Смежные вопросы