0

最近、JavaScriptの奇妙な動作で問題が発生しました。私はこのようなことをしたい:

var lang = null;

function getLang() {
    if (browserLanguageIsGerman) {
        lang = 'de';
    }
    else {
        lang = 'en';
    }
    // alert(lang) shows "de"

    $('#someID').load(someValidUrl, null, 
        function(response, status, xhr) {
            if(languageSettingsOnFacebookIsGerman) {
                lang = 'de';
            }
            else {
                lang = 'en';
            }
            // alert(lang) show "en"
    );
    // alert(lang) shows "de"
}

1番目と2番目のアラートは、正確な値1) "de" 2)"en"を示します。3番目のアラートは「de」を示していますが、「en」ではないでしょうか。また、2番目のアラートは3番目のアラートの後にポップアップします。

誰かが私の心の明らかなバグを喜ばせることができますか?:)

前もって感謝します!

4

2 に答える 2

8

これはスコープの問題ではありません。loadメソッドは非同期です。3番目alertは、に渡すコールバックの前に実行されますload。その非同期呼び出しの結果に依存するコードをコールバックに移動します。

または、 jQueryの遅延オブジェクトAPIを調べることもできます。遅延オブジェクトAPIを使用する場合は、呼び出し先をまたloadはへの呼び出しに変更する必要があることに注意してください。これは、Promiseインターフェイスを実装していないjQueryのインスタンスを返すためです。jQuery.getjQuery.ajax.load

于 2012-07-06T13:01:14.400 に答える
0

いいえ、すべきではありません。「load」は、「someValidUrl」からの情報がフェッチされるのを待ちません。代わりに、情報が利用可能になったときに内部関数が後で実行されるのを延期し、待たずにすぐに戻ります。それは「非同期」と呼ばれます。

于 2012-07-06T13:04:23.637 に答える