0

次のような同期コードがあります。

function bulk_upload(files, callback) { 
  for (file in files) {
   sync_upload(file); // blocks till file uploads
  }
  print('Done uploading files');
  callback();
}

async_upload(file, callback)同じことをする代わりに、非同期 API を使用する必要がありますsync_upload(file)。さまざまなオプションがありますが、何が最適かわかりません。

1) sleepfor ループの後に a を使用します - タイミングが正しいことを祈る必要があるため、これはハックです

2) 配列を再帰的にチェーンします。

function bulk_upload(files, callback) {
  if (files.length == 0) {
    print('Done uploading files');
    callback();
  } else {
    async_upload(files.removeLast(), function() { bulk_upload(files, callback); });
  }
}

これはハックであるだけでなく、新しいasync_uploadAPI を使用してファイルを並行してアップロードすることもできましたが、最終的には順番にアップロードすることになったため、最適ではありません。

3) グローバル カウンターを使用します。

function bulk_upload(files, callback) {
  uploads = 0
  for(file in files) {
    async_upload(file, function() { uploads++; }); 
  }
  while(uploads < files.length) ; // Empty spin - this is stupid
  print('Done uploading files');
  callback();
}

4) わずかに優れたカウンター (ただし、それでもひどい):

function bulk_upload(files, callback) {
  uploads = 0
  for(file in files) {
    async_upload(file, function() { 
      if (++uploads == files.length) { // this becomes uglier as I want to await on more stuff
        print('Done uploading files');
        callback();
      }; 
    }); 
  }
}
4

2 に答える 2

3

asyncこれを行うには、モジュールのforEachメソッドを使用できます。

function bulk_upload(files, callback) {
    async.forEach(files, async_upload(file, callback), function (err) {
        if (err) {
            console.error('Failed: %s', err);
        } else {
            console.log('Done uploading files');
        }
        callback(err);
    });
}
于 2012-10-01T02:06:15.933 に答える
2

私のコメントに加えて、このコードは先物を使用して十分であるように見えます(テストされていません)。

function aync_upload_promise(file) {
    // create a promise.
    var promise = Futures.promise();
    async_upload( file, function(err, data) {
        if (err) {
            // break it
            promise.smash(err);
        } else {
            // fulfill it
            promise.fulfill(data);
        }
    });
    return promise;
}

var promises = [];
for(var i=0; i<files.length; ++i )
{
   promises.push( aync_upload_promise( files[i] ) );
}

Futures
   .join( promises )
   .when( function() {
      print('Done uploading files');
      callback();
   } )
   .fail( function(err) { print('Failed :(', err); } )
于 2012-10-01T00:39:38.627 に答える