【问题标题】:Writing a JSON file after a lot of async requests在大量异步请求后编写 JSON 文件
【发布时间】:2012-09-14 19:59:27
【问题描述】:

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

这是我的文件布局

var finalObj = {}; for(i=0;i

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

【问题讨论】:

    标签: javascript node.js request


    【解决方案1】:

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

    【讨论】:

    • 我知道怎么写一个JSON文件,,,,请告诉我当所有请求完成时如何通知???
    • 添加一个全局计数器变量和方法来写入 JSON 字符串。让每个请求增加计数器变量(Javascript 不是多线程的,因此您不会有竞争条件),并让您的 write 方法检查计数是否等于您发送的请求数。如果不是,请返回。如果是,打印字符串。
    【解决方案2】:

    每次收到请求时添加一个计数器来增加如何?当计数器与请求总数匹配时,就该写入了。

    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
        }
      })
    }
    

    【讨论】:

    • bt 我的情况更糟,我没有使用 for 循环。它是一个while循环。
    • 有什么通用的方法吗?或者有什么办法可以让所有这些请求同步?
    【解决方案3】:

    注意应该是JSON.parse(body)才能正确解析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,它简化了写入文件的过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2019-07-18
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多