gpt4 book ai didi

jQuery jqXHR - 取消链式调用,触发错误链

转载 作者:行者123 更新时间:2023-12-03 22:00:36 24 4
gpt4 key购买 nike

我正在创建一个 ajax 实用程序来与我的服务器方法交互。我想利用 jQuery.ajax() 调用返回的对象的 jQuery 1.5+ 延迟方法。情况如下。

  1. 服务器端方法始终返回 JSON 对象:

    { 成功:true|false,数据:... }

  2. 客户端实用程序像这样启动 ajax 调用

    var jqxhr = $.ajax({ ... });

  3. 问题区域:

    jqxhr.success(function(data, textStatus, xhr) {
    if(!data || !data.success) {
    ???? // abort processing, trigger error
    }
    });
    return jqxhr; // return to caller so he can attach his own handlers

所以问题是如何取消对所有附加成功回调的调用者的调用,并在 ???? 提到的地方触发他的错误处理程序?

文档说延迟函数调用列表是先进先出的,所以我的成功处理程序肯定是第一个。

最佳答案

(更新:请注意,目前 jQuery Promises 与 Promises/A+ specification 不兼容。 - 更多信息this answer .)

在创建 AJAX 请求的函数中,您还可以创建一个延迟对象,并在将其解析和拒绝函数绑定(bind)到 $.ajax 请求的适当回调并进行一些自定义数据验证后,向调用者返回一个 promise ,例如这个:

function makerequest() {

var deferred = $.Deferred();
var promise = deferred.promise();

var jqxhr = $.ajax({
// ...
});

jqxhr.success(function(data, status, xhr) {
if (!data || !data.success) {
deferred.reject(jqxhr, 'error');
} else {
deferred.resolve(data, status, xhr);
}
});

jqxhr.error(function(jqXHR, status, error) {
deferred.reject(jqXHR, status, error);
});

return promise;
}

现在任何人都可以像对您的函数这样的任何 promise 一样使用它:

var request = makerequest();

request.done(successCallback);
request.fail(errorCallback);

或者只是:

makerequest().then(successCallback, errorCallback);

如果您还添加此内容:

    promise.success = promise.done;
promise.error = promise.fail;

然后你的调用者将拥有(也许更熟悉的).success() 和 .error() 接口(interface),就像纯 $.ajax() 调用一样:

var request = makerequest();

request.success(successCallback);
request.error(errorCallback);

(.complete() 的实现留给读者作为练习。)

查看此演示:

这是直接从工作项目中提取的另一个示例:

function ajax(url, data) {
var self = this;
var deferred = $.Deferred();
var promise = deferred.promise();

var jqxhr = $.ajax({
url: url,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: 'json',
type: 'POST'
}).done(function (msg, status, xhr) {
if (!msg || msg.Error) {
self.doError(msg.Error);
deferred.reject(jqxhr, 'error');
} else {
deferred.resolve(msg, status, xhr);
}
});

return promise;
}

关于jQuery jqXHR - 取消链式调用,触发错误链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5111695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com