3

このコードを使用する場合:

async.eachLimit(body.photos.photo, 10, function(photo) {

         var flickr_getphoto_path = ".....";

         request.get({url: flickr_host_url + flickr_getphoto_path, json: true}, function(error, response, body) {
           if (!error && response.statusCode == 200) {

             console.log("SIZES LENGTH: " + body.sizes.size.length);
             var source_url = body.sizes.size[body.sizes.size.length - 1].source;
             request(source_url).pipe(fs.createWriteStream(path_for_downloads + path.basename(source_url)));
           }
         });

}

処理は 10 回の要求の後 (つまり、最初のサイクルの後) に停止します。10サイクルあるはずです。

正しく動作しない理由を誰かが知っていますか?

4

1 に答える 1

5

非同期関数を間違って設定しました。3 番目の引数 (イテレータ関数) は 2 つのパラメータを取ります: 反復されるアイテムと、それが完了したことを async に伝えるコールバックです。コールバックが欠落している (したがって呼び出していない) ため、async は次のバッチを実行する時間であることを知りません。

var async = require('async');

async.eachLimit(body.photos.photo, 10, cacheOnePhoto, function(err){
  if(err){
    console.log(err);
  } else {
    console.log('Processing complete');
  };
})

function cacheOnePhoto(photo, done){
  var flickr_getphoto_path = ".....";
  request.get({
    url: flickr_host_url + flickr_getphoto_path, 
    json: true
  }, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log("SIZES LENGTH: " + body.sizes.size.length);
      var source_url = body.sizes.size[body.sizes.size.length - 1].source;
      request(source_url).pipe(
        fs.createWriteStream(path_for_downloads + path.basename(source_url))
      );
      done(null);
    } else {
      done('Request error for '+flickr_getphoto_path);
    }
  });
};
于 2013-06-21T13:54:16.020 に答える