web-dev-qa-db-ja.com

jQuery.ajax()メソッドの非同期オプションは非推奨になりましたが、今はどうですか?

JQuery 1.8では、async:false in jQuery.ajax() isdeprecated
しかし、進行中のAJAX通信がバックグラウンドで行われているときに、 "ローディング画面"でいくつのWebページを見たことがありますか?私はおそらく何千ものそれらを見ました。

私の場合は、言語ファイルをロードする必要があるモバイルアプリを書いているということです。そして、最初に言語ファイルをロードし、言語ファイルからボタンおよびその他のGUI要素のテキストを取得します。

これは私にとって本当に悪いことです。言語ファイルがない場合、GUIが表示されないためです。それでは、どうすれば解決できますか?すべてのコードをsuccessコールバックに入れますか?それは私には良いコーディングの練習のように思えません。別の方法で解決できますか?

48
Juw

解決策は、ユーザーがインターフェイスと対話できないようにオーバーレイを手動で追加し、AJAXクエリが完了したら削除します。

$(function() {
    show_overlay();        

    $.ajax({
        // Query to server
    }).done(function() {
        // Verify good data
        // Do stuff
        remove_overlay();
    });
});
34
Jørgen R

このパラメーターの廃止についてチケットで 公式の議論 を読みましたが、ここに理解したことがあります:

  • 問題は、 Promise s( 1 )を同期AJAXに実装するとオーバーヘッドが発生することです。

  • 同期AJAXの実世界のユースケースは多数あります。ページのアンロード前に状態を保持します。したがって、この機能はそのままですが、使用方法は変わる可能性があります。

  • 最も近い解決策(1.8に上陸?)は、asyncfalseのときにコールバックのみをサポートします(ただし、Promiseはサポートしません)。

結論:必要に応じて_async: false_を使い続けますが、その欠点(VMのブロック)に注意してください。この機能が $.ajax() から削除された場合は、心配しないでください。

29
Infeligo

多くこれらの1000のページのうち、AJAX呼び出しを待っている間、実際にUIをブロックしません。代わりに、おそらく待機でUIを覆い隠します。呼び出し時に画面を表示してから、応答ハンドラーでそれを削除します。

UIを隠す方法はたくさんあります(モーダルに設定され、エスケープボタンや閉じるボタンのないjQuery UIダイアログを使用することもできます)。その決定はあなたに任せます。ただし、コードのレイアウトは次のようになります。

var someFunction = function () {

    // any pre-conditions to the logic
    // obscure the UI here

    $.ajax({
        url: 'ajax/test.html',
        success: function(data) {

            // handle the response
            // show the UI again

        },
        error: function(data) {

            // handle the response
            // show the UI again

        }
    }); 
}

イベントの順序を達成する方法は複数あると確信していますが、それが一般的な考え方です。 UIのブロックは決して意図されたものではなく、jQueryがincludeすることよりもremoveすることよりもさらに難しい決定だったと思います。非同期であることを意図しています。

3
David

このファイルを取得するためになぜajaxを使用するのですか? scriptタグを使用して含めるだけです。

いずれにせよ、すべてのコードをonSuccessに置くのではなく、代わりにそこからコードを実行する単一の関数を呼び出します。

0
Ariel