53

jQuery 1.8 の時点でasync:falsejQuery.ajax()での の使用は非推奨です
しかし、バックグラウンドで進行中の AJAX 通信が行われているときに「読み込み画面」が表示される Web ページをいくつ見たことがありますか? 私はおそらく何千ものそれらを見てきました。

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

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

4

4 に答える 4

38

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

$(function() {
    show_overlay();        

    $.ajax({
        // Query to server
    }).done(function() {
        // Verify good data
        // Do stuff
        remove_overlay();
    });
});
于 2012-07-12T08:46:44.923 に答える
30

このパラメーターの非推奨に関するチケットの公式の議論を読んだところ、次のように理解しました。

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

  • ページのアンロード前に状態を保持するなど、同期 AJAX の実際の使用例は数多くあります。したがって、この機能は残りますが、使用方法が変わる可能性があります。

  • 最も近い解決策 (1.8 に着陸しますか?) は、asyncfalse.

結論:async: false必要に応じて使い続けますが、その欠点 (VM のブロック) に注意してください。心配しないでください。この機能がフォームから削除された場合は、代替手段が提供されます$.ajax()

于 2012-08-01T08:19:06.257 に答える
3

これらの数千のページの多くは、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がその機能を含めることは、削除することよりもさらに難しい決断だったと思います。非同期であることが意図されています。

于 2012-07-12T08:49:04.553 に答える
-1

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

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

于 2012-07-12T08:46:38.407 に答える