我仍然试图了解Node中的异步流程。我试图读取db中的文件列表并将结果转换为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数组。
由于此流程适用于其他语言,我怀疑它与节点的asyn流程有关。我在这里如何解决这个问题。
任何帮助都会很棒......
答案 0 :(得分:0)
由于格式化,跟随程序流程有点困难。但我认为你是正确的,假设这与异步行为有关。如果我没有被格式化所欺骗,那么我认为你在循环的每次迭代中都在进行回调,这只适用于第一次迭代。我不确定您的sourcesList
是什么,但我会尝试构建一个包含sourcesList
中所有项目的查询。那你就不需要foor循环了。也许你可以使用$in
运算符。