3

Javascript がシングルスレッド言語であるという事実を考えると、ExtJs での次のコードの実行順序はどうなるでしょうか?

FuncA();

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

        FuncB();
    }
});

FuncC();

FuncD();

ここで、関数の実行順序は ACDB になりますか?

または

FuncB() が FuncC() または FuncD() の前に呼び出される可能性はありますか? はいの場合、どの条件で?

助けてくれてありがとう。

4

3 に答える 3

2

ajaxリクエストが同期的でない限り、順序は常にACDBになりますが、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秒かかりますが、リクエスト自体は約7ミリ秒しかかかりません(ローカルボックスです)が、ajaxリクエストは常に最後に起動することがわかります。次に、f1/f2への呼び出しをコメントアウトして再試行します。

于 2012-05-01T13:16:12.517 に答える
0

A {B} C {B} D {B}
b は、{b} とマークされたすべての位置で実行できます。ただし、一度だけ実行されます。
編集:-
JavaScript はマルチスレッド言語ではありません。queueそのため、実行するコードを維持します。そのため、到達するとfuncC実行が開始され、ii が返された後、(ajax 要求が完了した場合)FuncCキューで実行される次の関数が検索されるため、2 つの関数呼び出しの間でのみ実行できます。funcBfuncB

于 2012-05-01T13:20:40.667 に答える
-1

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

于 2012-05-01T13:46:17.567 に答える