1

我仍在尝试了解 Node.js 中的异步流程。我试图读取 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 数组。

由于此流程适用于其他语言,我怀疑它与节点的异步流程有关。我不知道如何解决这个问题。

任何帮助都会很棒..

4

1 回答 1

0

由于格式的原因,跟随程序的流程有点困难。但我认为你是正确的假设这与异步行为有关。如果我没有被格式所迷惑,那么在我看来,您在循环的每次迭代中都在进行回调,这仅适用于第一次迭代。我不确定你sourcesList是什么,但我会尝试构建一个包含sourcesList. 那么你就不需要for循环了。也许您可以使用$in运算符。

于 2013-04-08T11:39:22.963 回答