Zepto 的 $.post 没有错误处理程序

Zepto's $.post does not have error handler

我在我的应用程序中使用 Zepto 作为 jQuery 的替代方法,当我意识到 $.ajax 有一个错误处理程序时,我正在处理一项任务,但其他方法比如$.post$.get没有。

这可能是什么原因?

函数签名

$.post(url, [data], function(data, status, xhr){ ... }, [dataType])

$.get(url, [data], [function(data, status, xhr){ ... }], [dataType])

参考资料

  1. $.ajax
  2. $.post
  3. $.get

根据您关于 $.get$.post 的问题。是的,source code on github回答说这个方法没有错误处理程序,但是你可以在$.ajaxSettings

中添加常见的错误处理程序

但是 而不是带有回调的 $.ajax 更好地使用 Zepto deferred API. You must include it manually.

它提供 $.Deferred 承诺 API。取决于 "callbacks" 模块。 包含后,$.ajax() 支持用于链接回调的承诺接口。

使用 deferred 可以捕获 deferred/promise 链中的错误:

$.post(/*any options*/).done(/*success handler*/).fail(/*error handler*/)

$.post().then(function() {
   // success code here
}, function() {
   // error code here
});

在我看来,错误处理程序不可用,因为它会增加混乱。
当前函数说明:

$.get(url, [data], [function(data, status, xhr){ ... }], [dataType])

添加错误处理程序时,参数将转换为:

$.get(url, [data], [function(data, status, xhr){ ... }], [function(data, status, xhr){ ... }], [dataType])

在附加错误处理程序参数的情况下,很难理解您在进行 ajax 调用时所指的处理程序:

$.get('http://example.com', {query: 1}, function(result) {
    //Handle the request
});

在这种情况下,处理程序是针对错误还是成功?这很难理解。当然,您可以在参数中添加一些额外的 nulls,但这不是一个干净的解决方案并且会增加混乱。

$.ajax 有一个错误处理程序,因为它接受作为 JavaScript 对象的选项。如果您指定或不指定错误处理函数作为选项对象的 属性,它不会产生任何问题。

解决方法:
只需使用承诺方法:

var xhr = $.post(...);
xhr.done(function(data, status, xhr){ 
  //Handle when success
}).fail(function(xhr, errorType, error){
  //Handle when an error occurred.
}).always(function(){ 
  //A handler executed always, on success or error
  //Use this to hide the loading image for example
})

调用时,ajax 调用函数将 return 一个承诺对象。附加到您的成功(使用 done() 方法)和错误(using fail() 方法)处理程序的承诺。
always() 在任何情况下都会执行(在执行 done()fail() 处理程序之后)。完成与请求相关的任何工作很有用,例如隐藏加载图像。

@Pinal 的回答的扩展,我相信 parseArguments 函数正在产生问题:

原码

GET

$.get = function(/* url, data, success, dataType */){
  return $.ajax(parseArguments.apply(null, arguments))
}

解析参数

function parseArguments(url, data, success, dataType) {
  if ($.isFunction(data)) dataType = success, success = data, data = undefined
  if (!$.isFunction(success)) dataType = success, success = undefined
  return {
    url: url,
    data: data,
    success: success,
    dataType: dataType
  }
}

可能的解决方案

function parseArguments(url, data, success, error, dataType) {
  if ($.isFunction(data)) dataType = success, success = data, data = undefined
  if (!$.isFunction(success)) dataType = success, success = undefined
  if (!$.isFunction(error)) dataType = error, error = undefined
  return {
    url: url,
    data: data,
    success: success,
    error:error,
    dataType: dataType
  }
}

但是,是的,这可能是一个通用函数,更改它可能会产生很大影响。

这不是错误,这只是 Zepto 模拟的 jQuery API 的设计方式(参见 https://api.jquery.com/jquery.get/)。

如果您需要回调,请使用 $.ajax,全局回调或承诺。