2

ajaxの成功コールバックから内部Deferredオブジェクトにアクセスする方法はありますか?ajax呼び出しを関数に抽象化できるようにしたいのですが、その関数呼び出しを$ .when()でラップし、reject()とresolve()を使用して引数をdone()と次のようなfail()コールバック:

 $.when(makeCall())
 .done(function(data){
     //do something with data
  })
 .fail(function(message){
     //show error
  });

 function makeCall(){
     return $.ajax({
         url : //some url,
         success : function(data){
              if(!data.someCondition){
                 //i'd like to reject the internal deferred here
                 //and send it back an error message to my
                 //the callers fail method like reject('message')
              }
              else{
                 //i'd like to resolve the deferred here and 
                 //pass back the data to the callers done
                 //method like resolve(data)
              }
         }
     });
 }

現在、makeCall()を別のDeferredオブジェクトでラップし、ajaxコールバックでそのオブジェクトを解決または拒否していますが、余分なDefferedラッパーがなくてもこれを実行できるはずです。

4

2 に答える 2

1

いいえ、その時点ですでに解決または却下されています。この機能を取得するには、独自の deferred を作成する必要があります。

$.when(makeCall())
 .done(function(data){
     //do something with data
  })
 .fail(function(message){
     //show error
  });

 function makeCall(){
     var def = $.Deferred();
     $.ajax({
         url : //some url,
         success : function(data){
              if(!data.someCondition){
                 // reject it
                 def.rejectWith(data.someCondition);
              }
              else{
                 // resolve it
                 def.resolveWith(data);
              }
         }
     });
     return def.promise();
 }

編集:申し訳ありませんが、これがすでにあなたが試み、回避しようとしていたことに気づきませんでした。問題は、成功のコールバックで、遅延オブジェクトが既に解決されていることです。その時点で元に戻すことはできません。

編集:
エラーが発生した場合、サーバーが 200 ではなくエラー ステータス コードを返すようにする方が理にかなっているでしょうか? その時点で、応答テキストを json として解析し、遅延オブジェクトを通常以上にいじることなく、エラーを適切に処理できます。

于 2012-08-27T19:49:46.050 に答える
0

競合状態を防ぐためにこれを行う必要がありました-一部の応答を完全に無視したかった

元の保留を拒否できないことがわかったら、最終的にこのようなことをしました。理想的ではありませんが、必要なものには機能しました。もちろん、遅延オブジェクトを拒否 (または独自のものを作成) できたとしても、それはおそらく私が望んでいたことではありません。

function makeCall()
{
     return $.ajax({
         url : //some url,
         success : function(data)
         {
              if (!data.someCondition)
              {
                 data.ignore = true;
              }
         }
     });
 }


 makeCall().done(function(data) 
 {
      if (data.ignore) 
      {
          return;
      }
 });
于 2013-03-02T04:51:18.683 に答える