2016-08-01 63 views
1

我试着把握自己的承诺,它看起来很简单。我把它们想象成异步变量。我需要解决的问题之一是做出几个AJAX调用,这些调用都需要成功解决,将它们依次链接在一起,也就是我需要使它们同步以获得结果。由于使ajax调用sync: false已被弃用,我试图使AJAX与promises同步。手动解析AJAX返回承诺

 $.when(
      ajaxCall(param1), 
      ajaxCall(param2) 
    ).then(
     function(data) { 
      console.log(['OK: ',data]); 
     }, function() { 
      console.log('Error'); 
     } 
    ).fail(function() { 
     console.log('Fail'); 
    }); 

和AJAX调用函数定义为:

ajaxCall: function ($id) { 

     $.ajax({ 

      url: 'some_url' 
      type: 'POST', 
      dataType: "JSON", 
      data: packed, 

      success: function (data) { 

       var deferred = $.Deferred(); 
       switch (data.code) { 
        case 200: 
         deferred.resolve(data); 
         break; 
        default: 
         deferred.reject(data); 
         break; 
       } 

       return deferred.promise(); 

      }, 
      error: function() { 
       $.Deferred().reject(); 
      } 
     }); 

    } 

我直接做了一些假的AJAX调用,但从来没有执行.fail分支,我不知道是什么问题。 如果我将.then更改为.done,则至少会执行错误回调,但不管我尝试过什么,我从未到达Fail分支。

解决方案可能很简单,但看起来像我无法正确地制定问题找到解决我的问题。

所以我有树的问题:

  1. 为什么.fail永远不会被调用,而我需要做什么改变,使其工作?
  2. 我基本明白了.done.then之间的区别。当承诺解决时都会调用这两个函数,只有.then是可链接的,而不是(如果我是正确的)。 .done.fail通常配对成双方都有一个回调,而.then有两个。由于我在.done中使用了两个回调函数,为什么第二个回调函数会被调用,因为所有回调函数都是成功的回调函数?
  3. 为什么拒绝不叫失败分支?

任何帮助表示赞赏。

回答

0

你可以做类似下面

var ajaxCall= function ($id) { 
    return $.ajax({ 

     url: 'some_url' 
     type: 'POST', 
     dataType: "JSON", 
     data: packed, 

     success: function (data) { 

      var deferred = $.Deferred(); 
      switch (data.code) { 
       case 200: 
        deferred.resolve(data); 
       break; 
       default: 
        deferred.reject(data); 
       break; 
      } 

      return deferred.promise(); 

     }, 
     error: function() { 
      $.Deferred().reject(); 
     } 
    }); 
}; 

var successCall= function(){ 
// code after both request completed with success; 

}; 

var failureCall= function(){ 
// code after both request completed and if have error 

}; 

$.when(ajaxCall(param1),ajaxCall(param2)) 
    .then(successCall, myFailure); 

我没有测试过,但我看这种jQuery的文档中的代码在示例部分https://api.jquery.com/jquery.when/

说明结束执行功能myFunc的时候这两个Ajax请求都是成功的,或者如果其中任何一个出现错误,我都会失败。 ($ .ajax(“/page1.php”),$ .ajax(“/page2.php”)).then(myFunc,myFailure);}。

+0

你的代码和我的代码很相似,除了我的两个回调函数在'.then'块中。 – Izzy