2016-08-26 13 views
3

複数のリクエストをトリガして、順序を保持し、エラーを無視する必要があります。周りのドキュメントやコードをスカウトした後、次のパターンが出現するJavaScriptプログラマ、最初のタイマーのよう:予期せぬ引数の数を伴うjQuery.when.applyの処理

var requests = []; 
for (yadda yadda) { 
    request.push($.ajax()) 
} 
$.when.apply(null, requests).always(function() { 
    for (var i = 0; i < arguments.length; i++) { 
     var result = arguments[i]; 
     // do things 
    }  
}) 

それはそのように呼ばれたときは、リクエスト内のすべてのDeferredの作り方がある場合にのみ、トリガー延期マスターを作成することを私の理解でありますdone(正常かどうか)。

リクエストに1つの要素しか含まれていない場合、上記のコードは機能しません。その場合、whenは別の方法で動作し、私のalways()コールバックは長さ1の配列を受け取るのではなく、アンパックされた単一の応答オブジェクトを受け取ります。

私はこの問題の解決方法を見ていますが、それは慣用的な(または別のアプローチです)ものはありません。

+0

私は、コールバックが...それは、このユースケースを処理するために、これ以上のエレガントな方法があります –

答えて

0

これは回避策ですが、lengthresultsを使用して予期した応答を判断するのはなぜですか?それでは、あなたはいつも期待できるarrayを持っています。

if(requests.length == 1) { 
    arguments = [arguments]; 
} 

Working example.

別の解決策は、構造を変更し、正しいjQueryのパターンでそれを使用することです。その後、あなたは常にarrayという応答を受け取り、それ以上のことはしません。

Working example.

$.when(requests).always(function(response) { 
    response.forEach(r => console.log(r)); 
}) 
そして、あなたはあなたの例では、タイプミスを得たことに注意してください。それは requestsでなく、 requestでなければなりません。 A.Wolff @

requests.push($.ajax()); 
+0

だからあなたが言っている要求の数に依存して受信しようとしていることをどのように多くの引数を知らないので、 ? –

+0

構文にありません。私は答えを*より良いものに拡張しました。 @StefanoBorini – eisbehr

+0

2番目のオプションは引数応答として常に1つの要素(最初の要素)のみを返しますか? –

関連する問題