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 回调中解决或拒绝该对象,但感觉我应该能够在没有额外的 Defered 包装器的情况下做到这一点。

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 回答