ほくそ笑む

R言語と統計解析について

Titanium Mobile の HTTPClient は同期実行できる(iOSのみ)

知らなかったのでメモ。
Titanium Mobile の HTTPClient で Web API を叩くプログラムを書いていたのですが、非同期でしか Web アクセスできないと思いこんでいたので、非常にめんどくさいことしていました*1
非同期でしかできないという根拠は、公式ページのこれです。

Titanium.Network.HTTPClient
Methods

Name Description
send send the request (Only async is currently supported)
http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Network.HTTPClient-object.html

おもっきし "Only async is currently supported"(訳:今んところ非同期しかサポートしてないよ) と書いてありますよね。
しかし、open メソッドを見ると、こんな引数があります。

Titanium.Network.HTTPClient.open
Arguments

Name Type Description
async boolean optional property to indicate if asynchronous (default) or not
http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Network.HTTPClient.open-method.html

試しに open メソッドを async = false として実行してみると、send メソッドの呼び出しの後に書いたコードは、onload が実行された後に実行されました。
サンプルコードは以下です。

var client = Ti.Network.createHTTPClient();
client.onload = function() {
    Ti.API.log("execute onload()");
};
client.open("GET", "http://google.com", false);
Ti.API.log("previous statement of send()");
client.send();
Ti.API.log("next statement of send()");

これの実行結果は次のようになるはずです*2

[info] previous statement of send()
[info] execute onload()
[info] next statement of send()

つまり、send() の実行完了を待ってから、次のステートメントに移っています。
async = true (デフォルト)の場合、次のようになります(非同期実行されます)。

[info] previous statement of send()
[info] next statement of send()
[info] execute onload()

これ最初から知ってたら便利だったんだけどなー。くそー公式ページめー。

*1:setInterval とか使ってわざわざ wait してたりしてました

*2:このプログラム自体は試してはいませんが、同様なプログラムで確認しています