【问题标题】:Manually resolving AJAX return with promise使用 promise 手动解析 AJAX 返回
【发布时间】:2016-08-01 20:10:45
【问题描述】:

我试图抓住 promises 的头脑,它看起来很简单。我把它们想象成异步变量。我需要解决的问题之一是进行多个 AJAX 调用,所有这些调用都需要成功解决,将它们一个接一个地链接起来,也就是我需要使它们同步以获得结果。由于不推荐使用 ajax 调用 sync: false,因此我尝试使 AJAX 与 Promise 同步。

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

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

所以我有树问题:

  1. 为什么从未调用过.fail,我需要进行哪些更改才能使其正常工作?
  2. 我基本了解.done.then 之间的区别。两者都在 promise 被解决时被调用,只有 .then 是可链接的,而 done 不是(如果我是正确的)。 .done.fail 通常配对,因为它们都有一个回调,而 .then 有两个。由于我在.done 中使用了两个回调,为什么调用第二个,因为 done 中的所有回调都是成功回调?
  3. 为什么拒绝不调用失败分支?

感谢任何帮助。

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    您可以执行以下操作

    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);

    【讨论】:

    • 你的代码和我的差不多,只是我的两个回调函数在.then块内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多