1

独自の初期化関数が必要で、onloadイベントの後でのみ終了したいのですが、どうすればよいですか?

var qqq=0;
function init(){
    var requestClient= Ti.Network.createHTTPClient();
    requestClient.open('GET','https://mysite.com/api/123/id/5/friends');
        requestClient.onload = function() {
            alert('loaded');
        };
    requestClient.send();
};
init();
alert(qqq);
4

1 に答える 1

2

そうですね、リクエストを非同期ではなく同期にすることで、それを行うことができます。これは、ユーザーのブラウジングエクスペリエンスに不快な副作用をもたらし、リクエスト中に物事をロックする傾向がありますが、openの3番目の引数をfalseに設定すると、非同期ではなく同期になります。

var qqq=0;
function init(){
    var requestClient= Ti.Network.createHTTPClient();
    requestClient.open('GET','https://mysite.com/api/123/id/5/friends', false);
                                                           // Here------^
        requestClient.onload = function() {
            alert('loaded');
        };
    requestClient.send();
};
init();
alert(qqq);

同期リクエストは、ネットワーク操作が完了するまで、ページでのJavaScriptの実行(少なくとも、JavaScriptだけでなく多くのブラウザーで)を急停止させます。

ただし、通常はinit、ハンドラー内から呼び出すコールバックを受け入れるようにします。onloadこれにより、UXが大幅に向上します。

var qqq=0;
function init(callback){  // <== Accept a callback
    var requestClient= Ti.Network.createHTTPClient();
    requestClient.open('GET','https://mysite.com/api/123/id/5/friends');
        requestClient.onload = function() {
            alert('loaded');
            callback();   // <== Call the callback
        };
    requestClient.send();
};
init(function() {         // <== Pass the callback into `init`
    alert(qqq);
});

効果的なWebプログラミングとは、イベント駆動型の性質を取り入れることです。2番目の例を強くお勧めします。

于 2011-07-10T09:41:02.077 に答える