手动解决AJAX返回的承诺

时间:2016-08-01 11:01:41

标签: jquery ajax

我试图抓住承诺,看起来很简单。我把它们想象成异步变量。我需要解决的一个问题是进行几个AJAX调用,这些调用都需要成功解决,一个接一个地链接它们,我还需要让它们同步以获得结果。由于不推荐使用ajax调用sync: false,我试图使AJAX与promises同步。

     $.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,那么至少会执行错误回调,但无论我尝试了什么,我都没有达到失败分支。

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

所以我有树问题:

  1. 为什么永远不会调用.fail,为了让它起作用我需要改变什么?
  2. 我基本上了解.done.then之间的区别。当承诺得到解决时,两者都会被调用,只有.then可以链接而不完成(如果我正确的话)。 .done.fail通常配对,因为它们都有一个回调,.then有两个回调。因为我在.done中使用了两个回调,为什么第二个被调用,因为所有回调都是成功回调?
  3. 为什么拒绝不调用失败分支?
  4. 感谢任何帮助。

1 个答案:

答案 0 :(得分: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 );

我还没有测试过但是我在例子部分https://api.jquery.com/jquery.when/

中的描述末尾的jQuery文档中读到了这种代码
  

当两个ajax请求成功时执行函数myFunc,或者   myFailure,如果其中一个有错误。

     

$。when($ .ajax(“/ page1.php”),$ .ajax(“/ page2.php”))。then(myFunc,myFailure);