本当は非同期がいいけど、どうしても同期処理を。

HTML5, File API を利用すれば複数ファイルのアップロードが簡単にできることは、本当に素晴らしいことです。
それ以前や、利用ブラウザがどうしても古い(たとえばIE9以前とか)場合は、今でもFlashとJavasScriptの
連携で複数ファイルのアップロードを組み込んでいるケースもあると思います。

さて、ここでサーバ側の仕様変更は無しで、JavaScriptだけで複数ファイルのアップロード処理をする事になり
ました。

あれれ・・・と、利用している人たちが、今まではPCで選択した順番にファイルがアップロードできたのに?
これじゃ困るよ!と。
うーーん、仕方ないので、ajaxでのアップロード処理を同期処理に変更。
ああー、やっぱり非同期より遅くなった。

とりあえず、サーバ側の仕様変更は無しで、base64でアップロードされていたのをバイナリーでアップロード
するように変更。
ただしさすがにこれはサーバ側のプログラムは少し変更してもらう必要があります。
受信側プログラムを変更、よしよし前よりコードがすっきりしました。

さらに、非同期のソースはそのままにし、jqueryプラグインでの提供だったので、同期非同期は
選択できるように。

以下そのままでは動きませんが、こんな感じで無事に完結。

var xhr = new XMLHttpRequest();
xhr.open('POST', this.settings.uri, this.settings.async);
if (this.settings.async) {
  //タイムアウト設定が同期処理だとエラーになるので、非同期のときだけセット
    xhr.timeout = this.settings.timeout;
}
xhr.send(blob);