2013-04-08 2 views
1

Я все еще пытаюсь получить голову вокруг асинхронного потока в узле. Im пытается прочитать список файлов в db и преобразовать результат в массив json и вернуться обратно. Код работает отлично для одного объекта json. Но нет никакого вывода при чтении полного массиваВозвращение массива JSON в узле

Так это код

вызова функции - получить AJAX запроса от браузера и отправить обратно результат

module.retrieveSourceContent(req, res, result, function(err, result){ 
       if(err){ 
        console.log(err); 
        return; 
       } 
       console.log(result); 
       res.contentType('json'); 
       res.write(JSON.stringify(result)); 
       res.end(); 
      }); 

код

retrieveSourceContent : function(req, res, sourceList, callback){ 
     var sourceContent = new Array(); 
     MongoClient.connect(config.mongoPath+config.dbName, function(err, db) { 
      if(err){ 
      return callback(new Error("Unable to Connect to DB")); 
      } 
      var collection = db.collection(config.source); 
      for(i=0;i<sourceList['sources_FOR'].length;i++){ 
       //build the source JSON Array 
       collection.find({'_id':sourceList['sources_FOR'][i]}).nextObject(function(err, doc) { 
       if(err) 
        return callback(new Error("Error finding data in DB")); 
        var sourceObject = { 
         title  :doc.name, 
         tagCount :doc.tag.length, 
         tags  :doc.tag,  
         format :doc.type,  // Differentiate text, image, video and urls 
         content :doc.data  // Content 
        }; 
        sourceContent.push(sourceObject); 
        //if(i == sourceList['sources_FOR'].length - 1) 
         return callback(null, sourceContent); 

       }); 
      } 
     }); 
     } 

Этот код возвращает один объект json клиенту. Если я раскомментирую if(i == sourceList['sources_FOR'].length - 1), у меня нет выхода и ошибок нет. Но sourceContent.push(sourceObject); действительно создает массив json.

Поскольку этот поток работает на другом языке, я подозреваю, что он имеет какое-то отношение к асинному потоку узла. Я не понимаю, как это решить.

Любая помощь будет большой ..

ответ

0

Это немного трудно после потока программы из-за форматирования. Но я думаю, вы правы, полагая, что это связано с асинхронным поведением. Если меня не обманывает форматирование, мне кажется, что вы выполняете обратный вызов на каждой итерации цикла, который будет работать только для первой итерации. Я не уверен, что ваш sourcesList, но я бы попытался построить запрос, который включает все элементы в sourcesList. Тогда вам не понадобится петля. Возможно, вы можете использовать оператор $in.

+0

Привет, Нилш, Извините за форматирование. Пытался сохранить код как можно меньше. Да, im выполняет обратный вызов на каждую итерацию, так как обратный вызов не работает вне цикла. Таким образом, используется if-condition для проверки конца цикла, то есть где код перестает работать. 'SourceList' - это большой массив идентификаторов из одной таблицы, который я использую для извлечения данных из другой таблицы в массиве JSON и отображения клиенту. Да, теперь нужно изменить весь запрос. –

+0

Причина, по которой она перестает работать, заключается в том, что вы должны вызвать обратный вызов для продолжения потока. Поэтому, когда вы не вызываете обратный вызов в 'find', он будет просто ждать всегда. Есть решения для этого (синхронизация обратных вызовов), например, с помощью библиотеки потоков (для которой существует несколько вариантов), но в этом случае я думаю, что вам лучше исправить ваш запрос, чтобы цикл не требовался. – NilsH

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