0

我经常发现自己合并 jQuery ajax 错误和成功结果类似于以下内容:

$.ajax(
  success: function (response, statusText, xhr) {
    handleResponse(true, xhr, statusText, response, callback);
  },
  error: function (xhr, statusText, response) {
    handleResponse(false, xhr, statusText, response, callback);
  });

这通常是因为无论结果如何,都需要处理状态更改,但取决于它 - 更清楚地表明此状态更改仅被调用一次。此外,我经常根据特定的响应内容(例如 JSON 结果中包含的错误)将某些“成功”响应重新分配给错误处理。我还可以从某些类型的错误中整合成功类型的操作。当这些关注点相互影响时,它特别提高了整合的清晰度。

我的主要问题是,有没有更好的方法来处理这种错误/成功合并?

一个相关的问题是,jQuery 作者是否出于某种原因故意使这种使用变得不可访问,例如通过更改成功/错误回调之间的参数顺序,并且不提供isSuccess对 jqXhr 结果中的内部结果的访问?

编辑:我知道这个complete选项(类似于always()我在标题中提到的延迟)。但是,它不提供对成功/错误 HTTP 状态代码汇总的访问(isSuccess在上面提到的 jQuery 内部),也不在成功时反序列化 JSON。

编辑 2:我刚刚发现了jqXHR.isResolved()可用于测试 xhr 成功状态的出色功能,它只剩下手动反序列化响应。不幸的是,它被列为不推荐使用,尽管 jQuery 仍在内部使用它。

编辑 3:来自deferred原型的 jqXHR.state() 似乎在从.always(). 它看起来有点冒险,就像在处理事件时没有按设计顺序保证此状态的值。所以也许会发生变化。此外,.always()以这种方式使用仍然让我手动反序列化/解释接收到的数据。


也许你认为我想这样做很疯狂。也许你是对的;你是法官。目前有我备份的示例是我正在尝试向我的 ajax 调用添加一个透明的身份验证重试队列:

    this.exec = function (callback, parameters) {
        queue.add({
            url: settings.url,
            type: settings.post ? 'POST' : 'GET',
            data: parameters && parseInt(parameters) == parameters ? { id: parameters } : parameters,
            success: function (response, statusText, xhr) {
                handleResponse(true, xhr, statusText, response, callback);
            },
            error: function (xhr, statusText, response) {
                handleResponse(false, xhr, statusText, response, callback);
            }
        });
    }
    function handleResponse(success, xhr, statusText, response, callback) {
        if (settings.authRetry && xhr.status == 401) {
            authRetryQueue.notify(xhr);
        }
        else {
            queue.remove(xhr);
            if (callback) {
                if (success) {
                    if (xhr.method == 'GET' || response.StatusText == null || response.StatusText == 'success')
                        callback(true, settings.Model ? new settings.Model(response) : response);
                    else callback(false, response.StatusText);
                }
                else {
                    callback(false, response);
                }
            }
        }
    }
4

0 回答 0