2

Backbone.js を使用して、特定の機会に ajax ポストをクライアント Web サービスに送信する必要があるアプリケーションを作成します。

ただし、投稿されるコンテンツは動的であり、特定の配列によって決定されます。

配列内の各項目について、データを取得する必要があります。

集約オブジェクトを送信する必要があるデータを組み立てた後。

今のところ、私は同期アプローチを取っていますが、これは最善の方法ではないと感じています。

var arrParams = [{id: 1, processed: false},{id: 7, processed: false},{id: 4, processed: false}];

function callback(data) {
    $.post()... // jquery ajax to post the data... }

function fetchData(arr, data, callback) {
    var currentId = _(arr).find(function(p){ return p.processed === false; }).id;  // getting the ID of the first param that has processed on false...

    // ajax call fetching the results for that parameter.
    $.ajax({
        url: 'http://mysuperwebservice.com',
        type: 'GET',
        dataType: 'json',
        data: {id: currentId},

        success: function(serviceData) {
            data[currentId] = serviceData;  // insert it into the data
            _(arr).find(function(p){ return p.id === currentId; }).processed = true; // set this param in the array to 'being processed'.
            // if more params not processed, call this function again, else continue to callback
            if(_(arr).any(function(p){ return p.processed === false }))
            {
                 fetchData(arr, data, callback);
            }
            else
            {
                callback(data);
            }
        },
        error: function(){ /* not important fr now, ... */ }
    }); 
}

fetchData(arrParams, {}, callback);

これらの呼び出しを非同期で起動し、すべての結果が入っている場合にのみコールバックを実行する方法はありませんか?

4

2 に答える 2

8

それらを同期するには、JQuery$.Deferredオブジェクトを使用する必要があります。この記事を見てください延期されたドキュメント

次のように使用できます。

$.when(
   $.ajax({ url : 'url1' }),
   $.ajax({ url : 'url2' }) // or even more calls
).done(done_callback).fail(fail_callback);
于 2012-05-03T09:39:53.220 に答える
0

私はこのようなことをします:

fetchData に渡すパラメーターに加えて、arrParams 内のインデックスも取得する関数を作成し、ループ内ですべての要素に対してその関数を呼び出します。成功関数では、要素で処理されたものを true に設定し、配列を調べて「あなたが最後」かどうかを確認し、残りのすべても true かどうかを確認します。

カウンターを作成すると、少し最適化できます。

var todo = arrParams.length;

成功した場合は、次のことを行います。

if (--todo == 0) {
   callback(...)
}
于 2012-05-03T09:42:52.630 に答える