2012-05-03 14 views
2

を呼び出した後、関数を実行するより良い方法がありますか?Backbone.jsを使用しています。クライアントWebサービスにajaxポストを送信する必要があるアプリケーションがあります。Javascript:x量の非同期データベース/ ajaxが

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

アレイ内の各アイテムについて、データを取得する必要があります。

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

現在のところ、私は同期アプローチがありますが、これは最良の方法ではないと感じています。

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); 

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

答えて

8

JQuery $.Deferredオブジェクトを使用してそれらを同期させる必要があります。私はこのような何かをするだろう

$.when(
    $.ajax({ url : 'url1' }), 
    $.ajax({ url : 'url2' }) // or even more calls 
).done(done_callback).fail(fail_callback); 
+0

WAWを...私はこれについて知らなかった...それいいです! – fguillen

+0

はいdeferredsはいいです) –

+0

あまりにもajaxなしで動作しますか?私はあなたがローカルデータベースに行く状況を見ることができます。そこでは、関数が別々のデータベース呼び出しを待つべき状況にありますか? 私はそれが本当に複数のajax呼び出しを待つ良い方法だと言っていますが。 – Sander

0

を::この記事あなたはこの方法で使用することができますDeferred Docs

を見てください

あなたはなFetchDataに渡すパラメータ以外にもインデックスを取得することを機能させますarrParams内で、すべての要素に対して機能するループ呼び出しで実行されます。あなたの要素で処理された成功関数のセットで、配列を通って残りの部分が真であるかどうかを調べることで、 "あなたが最後です"をチェックします。

var todo = arrParams.length; 

とあなたが成功に:

最適化のビットは、あなたがカウンター作れば可能

if (--todo == 0) { 
    callback(...) 
} 
関連する問題