1

私には2つの関数があり、そのうちの1つには、本質的に投稿される複数のjson呼び出しが含まれています。

これらを同期させたい。つまり、前の投稿が完了したときにのみ実行する必要があります(すべての投稿が完了して成功した場合は、2番目の関数を起動する必要があります)。

コード構造は次のようになります。

    $.getSomeData = function() {
    $.postJSON("iwantdata.htm",{data:data},function(data)){
    });

    $.postJSON("iwantmoredata.htm",{data:data},function(data)){
    });
    });

    $.useSomeData = function() {
});

useSomeData、後続のjson呼び出しで機能する必要があります。

誰か助けてくれませんか?前もって感謝します。

4

3 に答える 3

1

したがって、基本的には次のようなものが必要です。

function chainPost(url1, url2, initialInput, func) {
    $.post(url1, {data: initialInput})
        .done(function (initialOutput) {
            $.post(url2, {data: initialOutput})
                .done(function (secondOutput) {
                    func(initialOutput, secondOutput);
                });
        });
}

chainPost("iwantdata.htm", "iwantmoredata.htm", 0, function (first, second) {
    alert(first);
    alert(second);
});
于 2012-07-12T04:29:25.453 に答える
1

最初の関数の完了関数で2番目の関数を開始して、それらをネストすることができます。

$.getSomeData = function() {
   $.postJSON("iwantdata.htm",{data:data},function(data) {
       $.postJSON("iwantmoredata.htm",{data:data},function(data)){
           // use the data here
       });
   });
};

非同期関数を処理する場合、次のようなコードを記述できません。

$.getSomeData();
$.useSomeData();

定義上、最初の関数は非同期であるため、2番目の関数が呼び出されてもまだ完了していません。また、JavaScriptには、非同期操作が実行されるまでJSの実行を停止する機能がありません。

use関数をget関数に渡すと、次のような上記の例への追加としてデータが利用可能になったときに呼び出されます。

$.getSomeData = function(fn) {
   $.postJSON("iwantdata.htm",{data:data},function(data) {
       $.postJSON("iwantmoredata.htm",{data:data},function(data)){
           fn(data);
       });
   });
};

次に、getSomeData(useFn)すべてのデータの準備ができたときに呼び出す関数の引数を取る関数があります。

于 2012-07-12T04:42:52.517 に答える
1

遅延オブジェクト[ドキュメント]はこれに最適です。残念ながら、コード例には構文エラーが含まれており、呼び出しがどのようにネストされているかが明確ではありません。したがって、両方のAjax呼び出しを次々に実行するのか、並列に実行するのかはわかりませんが、どちらの方法でも可能です。

これが2つの例です。詳細については、ドキュメントを参照して試してみてください。

注: .postJSONは組み込みのjQueryメソッドではありません。ここでは、$.ajax(または$.post)関数からの戻り値を返していると想定しています。

並列Ajax呼び出し:

$.getSomeData = function() {
    var a = $.postJSON("iwantdata.htm", {data:data});
    var b = $.postJSON("iwantmoredata.htm", {data:data});

    // return a new promise object which gets resolved when both calls are
    // successful
    return $.when(a, b);
};

// when both calls are successful, call `$.useSomeData`
// it will have access to the responses of both Ajax calls
$.getSomeData.done($.useSomeData);

見る: $.when

連鎖Ajax呼び出し:

...ここで、最初の呼び出しの応答は2番目の呼び出しの入力です。これは単なる例であり、もちろん、必要なデータを渡すことができます。

$.getSomeData = function() {
    return $.postJSON("iwantdata.htm", {data:data}).pipe(function(response) {
        // execute the second Ajax call upon successful completion 
        // of the first one
        return $.postJSON("iwantmoredata.htm", {data:response});
    });
};

// if both Ajax calls are successful, call `$.useSomeData`
// it will have access to the response of the second Ajax call
$.getSomeData.done($.useSomeData);

見る: deferred.pipe()

より複雑なロジックがある場合は、独自の遅延オブジェクトを作成、解決、または拒否することもできます。ドキュメントの例をご覧ください。

于 2012-07-12T14:14:20.577 に答える