次のような同期コードがあります。
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) sleep
for ループの後に 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_upload
API を使用してファイルを並行してアップロードすることもできましたが、最終的には順番にアップロードすることになったため、最適ではありません。
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();
};
});
}
}