在大量异步请求之后编写JSON文件

时间:2012-09-22 18:50:01

标签: javascript node.js request

我需要将大量异步请求后形成的最终对象写入JSON文件。

这是我的文件的布局

var finalObj = {};
for(i=0;i<100;i++){
  request.get("http://example.com/get/" +i,function(err,res,body){
    var tObj = json.parse(body);
    finalObj[tObj.name] = tObj.value;
  })
}

收到所有响应对象后,我想将finalObj保存到json文件中。我该怎么做?

3 个答案:

答案 0 :(得分:0)

如果您的JSON正确,那将会将数据导入该对象,但正如您所说,请求是异步的。您需要添加代码以监视何时完成所有请求并准备好写入对象。然后,使用JSON.stringify()将Javascript对象写入JSON。

答案 1 :(得分:0)

每次收到请求时,如何添加计数器以递增?当计数器与请求总数匹配时,是时候写了。

var finalObj = {},
    requestCount = 100,
    ticks = 0;

for(i=0; i<requestCount; i++){
  request.get("http://example.com/get/" + i, function (err,res,body) {
    var tObj = json.parse(body);
    finalObj[tObj.name] = tObj.value;
    ticks++;

    // check if all 100 have been received
    if (ticks == requestCount) {
      // write file
    }
  })
}

答案 2 :(得分:0)

请注意,正确解析正文应该是JSON.parse(body)

最简单的方法是使用一个在完成后递增的计数器,并检测你是否处理了所有请求;

var finalObj = {};
var counter = 0;

for(i=0;i<100;i++){
  request.get("http://example.com/get/" +i,function(err,res,body){
    var tObj = JSON.parse(body);
    finalObj[tObj.name] = tObj.value;

    if (++counter === i) {
        require('fs').writeFile('foo.txt', JSON.stringify(finalObj), function (err) { 
            if (!err) {
                // celebrate
            }
        }); 
    }
  });
}

有关文件写入方面的详细信息,请参阅File System module;幸运的是,他们有一个writeFile function,可以简化写入文件的过程。