2

次のコードを使用して、次のような複数の ajax リクエストを作成しています。

リクエスト1 開始| リクエスト1 仕上げ| リクエスト2 開始| リクエスト2 終了| ...

これはコードです:

var startingpoint = fireRequest(1);
    $.each(types,function(ix,type) 
    {
       startingpoint = startingpoint.pipe( function() 
       {
          alert(startingpoint.status); // undefined
          return fireRequest(type);
        });
    });

fireRequestは、$.ajax(...) を返す正しい ajax 関数への単なるスイッチケースです。

1 つのリクエストが失敗したときにチェーンを停止したい。実装を開始し、テストとして ajax オブジェクトのステータスを警告したいのですが、「未定義」と表示されます。どうすればステータスを取得できますか?

4

3 に答える 3

1

実装しようとしている動作は、既に .pipe() メソッドの動作です。パラメータとして 2 つのコールバックを取り、done コールバックのみを実行し、前のリクエストが成功した場合にチェーンに沿って続行します。これは、次の jsfiddle で説明できます: http://jsfiddle.net/dflor003/Vq2YF/ (注: JSON.stringify サポートと console.log サポートが組み込まれたブラウザーでこれを開きます)

リクエストのステータスを確認したい場合は、done コールバックの 2 番目のパラメータとしてステータスを取得します。詳細については、jQuery の API ドキュメント サイト ( http://api.jquery.com/deferred.pipe/ ) を参照してください。

于 2012-10-09T14:30:35.453 に答える
0

JS の例 1

このコードは、1 つの要求が (404 または 500 応答によって、またはタイムアウトによって) 失敗した場合に他の要求を中止することを想定しており、ビジネス ロジックの失敗シナリオを判断するためにデータ応答を評価する必要はありません。$.when()

このメソッドは、すべての Deferred が解決されるとすぐにそのマスター Deferred を解決するか、Deferred の 1 つが拒否されるとすぐにマスター Deferred を拒否します。

    $.when(fireRequest(1), fireRequest(2),fireRequest(3))
  .then(myAllSuccessfulFunc, oneFailedFunc);

function myAllSuccesfulFunc(req1,req2,req3){
//everything returned a 200.
   alert("these are not the droids you are looking for");
};
function oneFailedFunc(req1,req2,req3){
    //* each req looks like [ "not success", statusText, jqXHR ] */
//feel free to check what failed, but I don't know what you need

   req1[2].abort();
   req2[2].abort();
   req3[2].abort();
};

jsの例2

バックエンドからのロジックが原因で他のリクエストを失敗させる必要があるかどうかを確認するために、実際には成功したリクエストのレスポンスを解析する必要があります。

var stop = 4;
//if you are sure fireRequest(x) returns a good promise object, do this:
callNext(fireRequest(1),1);

function callNext(promise, currentIndex){
   promise.done(function(ajaxArgs){
   var jqXHR = ajaxArgs[2];
//replace this with some logic check that makes sense to your app
   if(/error/.test(jqXHR.responseText)){
    //do something
   }else if(currentIndex <stop){
    callNext(fireRequest(currentIndex+1),currentIndex+1);
   }).fail(function(ajaxArgs){
   //server returned a 404, or a 500, or something not a success.
   });
};
于 2012-10-08T03:32:41.873 に答える
0

問題は、$.Deferred同類が非同期および並行プロシージャを処理するように設計されているため、記述したとおりに動作させたい場合は、常に何らかの方法でそれらをだます必要があることだと思います。

( A JAXを使用して)呼び出しを次々に処理する必要がある場合は、それらを配列に入れ、単純な再帰関数を使用して、すべての呼び出しが完了するか、そのうちの1つが失敗するまでその配列をループすることをお勧めします。

これは基本的に次のように機能します。

var requests = [
  {
  url : '/serviceA'
  data : myParams4ServiceA
  },
  ...
  {
  url : '/serviceZ'
  data : myParams4ServiceZ
  }
];

AJAX リクエストの配列ができたので、それらを 1 つずつ処理する再帰関数を作成できます。

function work(){

$.ajax(requests[0]).done(function(data){
  //handle data here
  requests.shift(); //request is done and can be removed from the Array, request[0] will now be the next request in the queue

  if (requests.length){
    work(); //function calls itself again if there's still need for it
  } else {
    // we are done!
  }

}).fail(function(e){
  //call failed -> handle error
});

}

work();

成功したチェーンの例についてはthis fiddleを、失敗したチェーンについてはthis oneを参照してください。

もう 1 つの可能性は、AJAX 呼び出しを次のように設定することですasync : false(これは jQuery 1.8 以降では非推奨であることに注意してください: " jQuery 1.8 以降、jqXHR ($.Deferred) での async: false の使用は非推奨です。complete/success/ を使用する必要があります)。 error callbacks. " これは再び私たちを指し示しています)、$.when().then().fail()次のようなリクエストの配列に適用する単純なチェーンを使用します。

$.when.apply($, requests).then(function(){

    $.each(arguments, function(){
        //do stuff with your data
    });

}).fail(function(){

    //handle the error

});

通話がブロックされているため、これも連続して処理されます。そのためのフィドルも参照してください。

于 2012-10-08T07:34:43.903 に答える