2012-05-01 7 views
3

Javascriptがシングルスレッド言語であるという事実を考えると、ExtJsの次のコードでは何が実行されますか?ExtJs:ajax呼び出しでコード実行のシーケンスはどのようになりますか?

FuncA(); 

Ext.Ajax.request({ 
    url: 'ajax.php', 
    params: { 
     id: 1 
    }, 
    success: function(response){ 

     FuncB(); 
    } 
}); 

FuncC(); 

FuncD(); 

ここで、関数の実行順序はA-C-D-Bですか?

それとも

はfuncBのは()前FuncC()またはFuncD()に呼び出されることを、これまでは可能ですか?はいの場合は、どの条件ですか?

ご協力いただきありがとうございます。

答えて

2

ajaxリクエストが同期していない限り、オーダーは常にA-C-D-Bになりますが、UIをハングアップさせるので実際には使用することはお勧めしません。

例えば、(好ましくは、Chromeで)これを試してみてください

function f1() { 
    var s = ''; 
    for (var i = 0; i < 10000000; ++i) { 
     s += 'a'; 
    } 
} 

function f2() { 
    var s = ''; 
    for (var i = 0; i < 10000000; ++i) { 
     s += 'b'; 
    } 
} 

Ext.require('Ext.Ajax'); 

Ext.onReady(function() { 

    var d; 
    Ext.Ajax.request({ 
     url: 'data.json', 
     success: function(){ 
      console.log('finished'); 
     } 
    }); 

    d = new Date(); 
    f1(); 
    console.log(new Date() - d, 'f1 done'); 
    d = new Date(); 
    f2(); 
    console.log(new Date() - d, 'f2 done'); 

}); 

あなたはそれがコードを実行するために1秒を周りに要するにもかかわらず、Ajaxのリクエストがあっても常に要求のみ自体が、最後の発射ことがわかります約7msかかります(ローカルボックスです)。次に、f1/f2の呼び出しをコメントアウトしてもう一度試してください。

+0

C関数に時間がかかる場合はどうなりますか? Ajaxコールに時間がかかりすぎるとどうなりますか? – sha

+0

それは問題ではありません。 C&Dメソッドは常に同期的に実行されるため、完了するまで「ロック」を解放しませんが、Ajaxリクエストの作成には少なくともいくらかの遅延があります。 –

+0

つまり、Bは新しい呼び出しスタックに入れられますが、CとDはAと同じスタックにあります。各スタックは、次の呼び出しが開始される前に常に完全に処理されます。 – user123444555621

0

{B} C {B} D {B}
Bは、{B}マークされたすべての位置で実行することができます。一度だけ実行されます。
編集: -
いいえjavascriptはマルチスレッド言語ではありません。実行するコードのqueueを維持します。それはfuncCに到達したときので、FuncCの実行を開始し、(AJAX要求が完了した場合)、次いでII戻った後funcBかもしれないキューで実行される次の機能を探しそうfuncBのみ2つの機能の間で実行することができる

+0

ポストのためにありがとうParv。それはすべてAjaxリクエストの完了に依存していますか?そして、この場合、実行は突然Ajax関数の成功にジャンプし、FuncB()の実行を開始します。アヤックスが完成するとすぐに? – netemp

+0

私は自分のansを編集しました –

+0

私の答えでサンプルコードを実行してください。 –

-1
を呼び出し

javascriptコードは上から下まで動くことに注意してください。この場合、コード実行はfuncA()で開始し、funcD()で終了しますが、funcB()はいつでもすぐに呼び出すことができます。ajax.phpが応答を返す時間に完全に依存するためです。

+0

B()は常に最後にのみ実行され、いずれの場合でもC()またはD()の前には実行されません。しかし、時間をありがとう。 – netemp

+0

@netemp:まあ、そうです。 – codef0rmer

関連する問題