0

現在、Wunderground から気象データを取得し、MongoDB に保存しています。データを収集する場所が 30 ありますが、1 分あたり 10 クエリしか実行できないため、配列内の各郵便番号を 10 秒ごとにクエリする「タイマー」を設定しようとしています。

現在、私のコードはデータを正常に収集して Mongo に書き込むことができるので、問題はありません。問題は、各 API 呼び出し間の遅延の設定にあります。私は javascript にかなり慣れていないため、非同期処理にも慣れていないため、問題が発生しています。setInterval() を使用してみましたが、あまり成功しませんでした。

MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err,db) {
var zip = ["zip1","zip2","zip3","zip4","zip5","zip6","zip7"] ;
for(var i = 0; i<zip.length; i++) {

  // Define the Wunderground method.
  var method = "/api/" + apiKey + "/conditions/q/" + zip[i] + ".json";

  // Define the HTTP post properties.
  var options = {
    host: 'api.wunderground.com',
    path: method,
    method: 'GET',
    port: 80
  };

  // Create the HTTP POST.
  var request = http.request(options, function (response) {
    var str = '';

    // Create the listener for data being returned.
    response.on('data', function (chunk) {
      str += chunk;
    });

  // Create the listener for the end of the POST.
  // Send data to MongoDB

    response.on('end', function (){
      var myObject = JSON.parse(str);

            var location = myObject.current_observation.display_location.full
            db.collection('weathercollection').save(myObject, function(err, records) {
              console.log(location);
            });       
    db.close;
    });             // close response.on
  });               // close var request
  request.end();    // Close the HTTP connection.
};                  //close for loop
});
4

2 に答える 2

2

私は次のようなものを提案します:

MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) {
    var zips = ["zip1", "zip2", "zip3", "zip4", "zip5", "zip6", "zip7"];
    getWeather(zips, zips[0], db);
});

function getWeather(zips, zip, db) {
    var options = {
        host   : 'api.wunderground.com',
        path   : "/api/" + apiKey + "/conditions/q/" + zip + ".json",
        method : 'GET',
        port   : 80
    };

    var request = http.request(options, function (response) {
        var str = '';

        response.on('data', function (chunk) {
            str += chunk; // why get chucked data if you need it all ?
        });

        response.on('end', function () {
            var myObject = JSON.parse(str);

            var location = myObject.current_observation.display_location.full
            db.collection('weathercollection').save(myObject, function (err, records) {
                console.log(location);
            });
            db.close;
            request.end();
            var next_zip = zips.indexOf(zip) == zips.length ? 0 : zips.indexOf(zip) + 1;
            setTimeout(function () {
                getWeather(zips, next_zip, db);
            }, 10000);
        });
    });
}
于 2013-11-14T18:56:40.233 に答える
1

1 つのアプローチは、forループの代わりに setTimeout を使用することです。

現時点の:

for(var i = 0; i<zip.length; i++) {
    //Make request...
}

新しい:

var i = 0;
(function loopFn() {
  // Make request...
  i++;
  if (i < zip.length) setTimeout(loopFn, 10000);
})();
于 2013-11-14T18:54:44.397 に答える