Я все еще пытаюсь получить голову вокруг асинхронного потока в узле. 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.
Поскольку этот поток работает на другом языке, я подозреваю, что он имеет какое-то отношение к асинному потоку узла. Я не понимаю, как это решить.
Любая помощь будет большой ..
Привет, Нилш, Извините за форматирование. Пытался сохранить код как можно меньше. Да, im выполняет обратный вызов на каждую итерацию, так как обратный вызов не работает вне цикла. Таким образом, используется if-condition для проверки конца цикла, то есть где код перестает работать. 'SourceList' - это большой массив идентификаторов из одной таблицы, который я использую для извлечения данных из другой таблицы в массиве JSON и отображения клиенту. Да, теперь нужно изменить весь запрос. –
Причина, по которой она перестает работать, заключается в том, что вы должны вызвать обратный вызов для продолжения потока. Поэтому, когда вы не вызываете обратный вызов в 'find', он будет просто ждать всегда. Есть решения для этого (синхронизация обратных вызовов), например, с помощью библиотеки потоков (для которой существует несколько вариантов), но в этом случае я думаю, что вам лучше исправить ваш запрос, чтобы цикл не требовался. – NilsH