2015-02-27 3 views
0

Я имею свой код, какданные петли с Node.js

function updateData(data){ 
    data.forEach(function(obj){ 
     users.find({_id:obj.userId}).toArray(
     function(e, res) { 
      obj.userData = res; 
      console.log(res) 
     }); 
    }); 
    return data; 
} 

Проблема в том, я не могу найти обновленные данные, я пытаюсь обновить свои данные и добавить еще одно поле, чтобы оно основано на Идентификатор пользователя. Параметр data - это массив, содержащий вывод из таблицы комментариев. надеюсь, вы понимаете сценарий.

ответ

1

Похоже, что users.find({...}).toArray(function(...){...}) собирается быть асинхронными, так что нет никакого способа, которым вы можете быть уверены в том, что вызов дб был завершен, и что каждый data.obj был обновлен до data возвращаются.

Вместо использования яваскрипта Array.prototype.forEach() функции, вы можете использовать NodeJS async.each функцию из async library по Caolan, который будет перебирать массив, обновлять каждый объект, а затем вернуть data объект только тогда, когда все функции звонки завершены.

Например:

var async = require("async"); 

function updateData(data){ 
    async.each(data, function(obj, callback) { 
     users.find({_id:obj.userId}).toArray(
      function(e, res) { 
       obj.userData = res; 
       callback(e); 
      } 
     ); 
    }, 
    function(error){ 
     return data; 
    } 
} 
+0

Все еще получаю тот же результат. Я новичок в обратном вызове Node.js. можете ли вы предоставить некоторую ссылку, где я могу найти больше вещей, чтобы понять всю эту картину? –

+0

Существует раздел «Что такое обратные вызовы?». в [этот учебник] (http://www.theprojectspot.com/tutorial-post/nodejs-for-beginners-callbacks/4). Если вы чувствуете себя авантюристом, то есть [эта статья] (http://callbackhell.com/) о «Callback Hell» и как ее избежать. Появляются ли ваши сообщения журнала консоли в вашем терминале? Вы также должны проверить 'e', чтобы увидеть, возвращается ли ошибка –

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