2017-01-13 12 views
1

jquery whenの例を使用しようとしましたが、いくつかのajaxを送信すると問題が発生します。なぜ怒っているのか分かりません。一般的に、複数のAjaxを送信しようとすると、レスポンスが悪くなります。

Workflow.prototype.ajaxWorkflowsPaymentProcessTransitionsAvailable = function (barcodes) { 
     var workflow = this; 
     return $.ajax({ 
      url: "api/v1.0/workflows/paymentProcess/transitions/available", 
      type: "POST", 
      data: {barcodes: barcodes}, 
      dataType: 'JSON' 
     }); 
    }; 
Workflow.prototype.ajaxViewsDocuments = function (fd) { 
     var workflow = this; 

     return $.ajax({ 
      url: "api/v1.0/views/documents", 
      type: "POST", 
      data: fd, 
      processData: false, 
      contentType: false, 
      dataType: 'JSON' 
     }); 
    }; 

$.when(workflow.ajaxViewsDocuments(fd), workflow.ajaxWorkflowsPaymentProcessTransitionsAvailable(barcodes)).done(function(a1, a2){ 
      console.log(a1, a2); 
     }); 

とI`vはにconsole.logでこれを得た:

I`mこのようにそれをやって

enter image description here

が、サーバーの応答この:

enter image description here enter image description here

サーバーを返す同じ応答を取得するにはどうすればよいですか?

答えて

2

jQuery ajaxは3つの結果を返します。したがって、$.when()で2つのajax呼び出しを使用する場合、$.when()コールバックに渡される各引数は2つの配列に渡されます。各配列には、その中のajax呼び出しの3つの引数があります。

だから、これはあなたのコード変更に:これまで

console.log(a1, a2); 

console.log(a1[0], a2[0]); 

あなたが戻ってjQueryのAJAX呼び出しから取得する代表的な三つの引数がa1[0]a1[1]a2[2]に渡されます。返されるデータ引数は、各配列の[0]要素にあります。文書hereに例があります。


あなたの周りには3つの結果値をだとると、1つの結果値にそれらをダウントリムう$.ajax()を独自のラッパーを作成することができ、その後$.when()は、配列に入れません。これは($.ajax()から$.ajax2()への変化に注意してください)のように

// wrapper function to make return result from $.ajax() be one single argument 
$.ajax2 = function() { 
    return $.ajax.apply($, arguments).then(function(result) { 
     // return only single result, not all three typical arguments 
     // so $.when() won't put the args in an array 
     return result; 
    }); 
}; 

その後、あなたはそれを使用します。私はここにjQueryの1.1、2.xおよび3.xとのコンセプトをテストし

Workflow.prototype.ajaxWorkflowsPaymentProcessTransitionsAvailable = function (barcodes) { 
    var workflow = this; 
    return $.ajax2({ 
     url: "api/v1.0/workflows/paymentProcess/transitions/available", 
     type: "POST", 
     data: {barcodes: barcodes}, 
     dataType: 'JSON' 
    }); 
}; 
Workflow.prototype.ajaxViewsDocuments = function (fd) { 
    var workflow = this; 

    return $.ajax2({ 
     url: "api/v1.0/views/documents", 
     type: "POST", 
     data: fd, 
     processData: false, 
     contentType: false, 
     dataType: 'JSON' 
    }); 
}; 

$.when(workflow.ajaxViewsDocuments(fd), workflow.ajaxWorkflowsPaymentProcessTransitionsAvailable(barcodes)).done(function (a1, a2) { 
    console.log(a1, a2); 
}); 

https://jsfiddle.net/jfriend00/2mcLsw3f/

+0

私はあなたが提案するものでそれを得ることができると知っていますが、私はこの方法でそれを取得したくありません。私は、この配列を使用してサーバからの応答を同じようにしたいと思います。私はa1 [0]などを使用したくない。 – rad11

+0

@ rad11 - これはjQuery Ajaxが '$ .when()'でどのように動作するかを示している。私はそれが壊れたデザインのようなものであることに同意します(特にES6がどのように仕事を約束するかを考えれば)。しかし、あなたはそれを変更することはできません。 – jfriend00

+0

ありがとうございました:) – rad11

関連する問題