1

以下の関数で2番目のAJAXリクエストを同期ではなく非同期にするにはどうすればよいですか? result'start of string' で始まり 'end of string' で終わる文字列ですが、文字列の途中には、反復される最初の AJAX 要求の結果が入ります。

Foo = {
    foo: function() {
        $(document).on("change", '.foo', function(e) {
            e.preventDefault();
            $.ajax({
                url: "foo.php",
                success: function(rows) {
                    $.each(rows, function() {
                        var result = 'start of string'; // START
                        $.ajax({
                            url: "bar",
                            async: false, // I DON'T want this
                            success: function(data) {
                                result += data; // MIDDLE
                            }
                        });
                        result += 'end of string'; // END
                    });
                }
            });
        });
    }
}

ありがとうございました。

4

4 に答える 4

3

jquery 遅延オブジェクトを利用できます。異なる関数で 2 つの異なる ajax 呼び出しを行うことができ、.done() メソッドを使用して、両方の ajax 呼び出しが完了したら最終的な文字列を確実に取得できます。

ここでもっと読む:

于 2013-03-20T10:08:06.263 に答える
3

jquery では、次々に実行される非同期呼び出しをチェーンする方法は 、以前の jquery バージョンでpromise.then()も呼び出された を使用しています。promise.pipe()

Foo = {
    foo: function() {
        $(document).on("change", '.foo', function(e) {
            e.preventDefault();

            var param1 = {url: "foo.php"};
            var param1 = {url: "bar"};

            $.ajax(param1)
               .then(function(rows) {
                    var result = 'start of string'; //START
                    var fn = function(data) {
                       result += data;
                    }
                    var last, first;
                    $.each(rows, function() { // rows should be iterable
                        if (!last) { 
                           first = last = $.ajax(param2).done(fn)
                        } else {
                           last = last.then(function(res) {
                              return $.ajax(param2).done(fn);
                           });
                        }
                    });
                    last.done(fn).done(function() {
                       result += 'end of string'; // END
                    });
                    return first;
               });
        });
    }
}
于 2013-03-21T00:47:03.177 に答える
2

私はあなたが見るべきだと思うjavascript promise design pattern

少し説明させてください。

この promise は一種のプロキシであり、操作の将来の結果を表します。次に、プロミスにコールバックを登録します。これは、操作が完了して結果が利用可能になると、プロミスによって実行されます。

jQuery を使用すると、次のように promise を定義できます。

var promise = $.getJSON('url');

次に、promise 変数を使用して、リクエストが完了または失敗したときに何をするかを定義したり、失敗または成功した場合に何らかの機能を実行したりすることもできます。

promise.done(function(s) {alert('done successfully'); });
promise.fail(function(){ alert('get failed!'); });
promise.always(function(){ alert('this 'll executed anyway!'); });

そこにはたくさんのチュートリアルがあります

jQuery の Promise と Deferred オブジェクト

jQuery: 遅延オブジェクト

JavaScript の約束

CommonJSの「約束」抽象化の利点は何ですか?

于 2013-03-20T10:58:37.920 に答える
2

これを行う最も簡単な方法は、遅延オブジェクトを使用することです。これは、jQuerywhendone遅延ステートメントを使用する JavaScript の例です。

$.when(ajaxCallOne()).done(ajaxCallTwo(rows));

function ajaxCallOne() {
    return $.ajax({
                url : "foo.php",
                async: true
            });
}

function ajaxCallTwo(rows) {
    var result = 'start of string';
    $.each(rows, function() {
        $.ajax({
            url : "bar",
            async : true,
            success : function(data) {
                result += data; // MIDDLE
            }
        });
        result += 'end of string'; // END
    });

    return result;
}

私は JavaScript や jQuery の専門家ではありませんが、これらの遅延オブジェクトを確認する必要があると思います。

于 2013-03-20T10:35:50.210 に答える