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])
参考资料
根据您关于 $.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
});
在这种情况下,处理程序是针对错误还是成功?这很难理解。当然,您可以在参数中添加一些额外的 null
s,但这不是一个干净的解决方案并且会增加混乱。
$.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,全局回调或承诺。
我在我的应用程序中使用 Zepto
作为 jQuery
的替代方法,当我意识到 $.ajax
有一个错误处理程序时,我正在处理一项任务,但其他方法比如$.post
,$.get
没有。
这可能是什么原因?
函数签名
$.post(url, [data], function(data, status, xhr){ ... }, [dataType])
$.get(url, [data], [function(data, status, xhr){ ... }], [dataType])
参考资料
根据您关于 $.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
});
在这种情况下,处理程序是针对错误还是成功?这很难理解。当然,您可以在参数中添加一些额外的 null
s,但这不是一个干净的解决方案并且会增加混乱。
$.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,全局回调或承诺。