2016-08-05 10 views
4

私は複数のajaxリクエストを送信しており、すべてのリクエストが成功した場合にコールバックを取得したいと考えています。私は$.when($.ajax(), [...]).then(function(results){},[...]);を見つけましたが、それはあなたが何をするつもりであるかを事前に知っている場合にのみ動作します。私の場合、それはユーザーの入力によって異なります。複数のAjaxリクエスト(コールバック1つ)

私は次のことを試してみましたが、どこかどのよう$.whenがに収まる私はわからない:

$.when(
    $('#piecesTable tr').not(':first').each(function(){ 

     // ...some prep... 

     $.ajax({ 
      // ...args here... 
     }); 
    }) 
).then(function() { 
    // All requests are done 
}); 

私は$.whenですべてのものを別々$.ajax呼び出しの結果を使用する方法を教えてください。それとも私はこれを別のやり方で扱うのですか?

私はあなたが探しているものの一般的な構造は、このようなものだと思います

答えて

5

var requests = []; 

// Populate requests array with ajax requests. 
requests.push($.ajax({ 
    // ... 
})); 

// Add as many requests as you want to the array. 

$.when.apply($, requests).done(function() { 
    var args = $.prototype.slice.call(arguments); 

    // args should contain the results of your ajax requests. 

    // Do whatever with the results. 
}); 
+0

プッシュの内側にアヤックスを置くとちょうど質問が私にエラーを与えるthis.pushStackは関数ではありません。 –

+0

@ H.C:pushStackではなく、pushです。 –

0

jQueryのドキュメントから:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).then(myFunc, myFailure); 

両方のAjaxリクエストが成功したときに関数myFuncを実行いずれかにエラーがある場合はmyFailureです。

ですから、リクエストの可変数を送信するためにこのシステムを使用することができますし、まだ同じコールバック関数を持っている:) @のTW80000の答えを適応

var requests = []; 
.... 
$.when.apply($, requests).done(myFunc, myFailure); 
2

$.when.apply($, arrayOfPromises)獣に近代的な代替があります:Promise.all

Promise.all(arrayOfPromises).then(function(arrayOfResults) { 
    // Use arrayOfResults 
}); 

Promise.allthenablesの配列を期待を呼び出して、すべてのオブジェクトが解決されたときに結果の配列で解決する約束を返します。 jQueryの約束はうまくいきます。なぜなら、それが必要なのは、それがthenablesであるからです。

Promiseをサポートしているブラウザ、またはPromise shim/polyfillが含まれているブラウザであれば、これを使用できます。その後、

var arrayOfPromises = []; 
$('#piecesTable tr').not(':first').each(function(){ 

    // ...some prep... 

    arrayOfPromises.push($.ajax({  // ** Push this promise into the array 
     // ...args here... 
    })); 
}); 

と配列を使用します。

だからあなたの場合には、アレイ構築したい(または、あなたが$.mapまたはArray#mapでそれを構築することができます。):

Promise.all(arrayOfPromises).then(function(arrayOfResults) { 
    // Use arrayOfResults 
}); 
関連する問題