【问题标题】:Simplest way to post-process the result of a jQuery ajax request?后处理 jQuery ajax 请求结果的最简单方法?
【发布时间】:2023-03-06 10:30:01
【问题描述】:

假设我有一个函数fancyParse 旨在获取服务器返回的响应并将其转换为其他内容。如果响应没有任何意义,或者设置了特殊的“内部错误”标志,则此函数将抛出。

我想将此函数链接到$.post 调用中,以获取新的Deferred。如果请求失败,或者fancyParse 抛出,这个新的 deferred 将会失败。如果请求成功并且fancyParse 成功,它将成功,并且重要的是,会将fancyParse 的结果传递给其成功回调。

完美的解决方案如下所示:

$.post('/url', etc).postprocess(fancyParse)
    .done(my_done_handler)
    .fail(my_fail_handler);

这样的东西已经可用,还是我需要自己写这样的postprocess

【问题讨论】:

    标签: jquery jquery-deferred


    【解决方案1】:

    您可以创建自己的延迟对象:

    $.postProcess = function(addr,test) {
      var dfd = $.Deferred();         // create deferred object
      $.post(addr)                    // make ajax call
      .success( function(response) {  // if ajax is OK
        if (test) {                   // Your filter test
          dfd.resolve("OK");          // if test is passed, call done()
        } else {
          dfd.reject("Bad test");     // otherwise call reject
        }
      })
      .error(function() {             // on ajax error
       dfd.reject("Error");           // reject
      });
      return dfd.promise();                     // return deferred object
    };
    
    //$.postProcess('/echo/json/',true)   // to test good case
    //$.postProcess('/echo/json/',false)  // to test bad test
    $.postProcess('/echo/error/',true)    // to test bad ajax
    .done( function(msg){
        alert('ok:'+msg);
    })
    .fail( function(msg){
        alert('fail:'+msg);
    });
    

    http://jsfiddle.net/bouillard/FRsjV/

    【讨论】:

    • 感谢您的努力,我已经 +1 了。我想我会将它用于我想到的其他事情,但对于后期处理,dataFilter 是完美的。
    • 是的,在这种情况下,datafilter 应该比 deferred 短。但是对于某些应用程序来说,延迟可能是一种非常方便的方式。谢谢。
    【解决方案2】:

    dataFilter函数可用于处理数据。您将其与您的请求一起传递。

    http://api.jquery.com/jQuery.ajax/

    $.ajax({
        ...,
        dataFilter: function (data, type) {
            // do something with data and return it
            return data.toLowerCase();
        }
    })
    

    【讨论】:

    • 文档没有说明这一点,但也许你知道:过滤函数中的异常是否会导致请求被视为失败?
    • 对不起,我不知道。但是为什么不捕获异常,然后从后处理器中调用错误处理程序呢?
    • 因为它不仅仅是调用错误处理程序。我也需要将Deferred 设为rejected,以便随后添加的任何错误处理程序也会被调用。
    • 已确认:如果抛出此错误,则会按预期调用失败处理程序。这当然是实现我想要的最简单的方法。
    • 这似乎存在问题,因为它与管道结果有关。如果添加 dataFilter,则下一个延迟对象不传递任何参数。
    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2013-04-12
    • 2013-04-23
    • 2012-03-05
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多