Javascript 未从重写的JQuery ajax XHR对象调用Done/Fail

Javascript 未从重写的JQuery ajax XHR对象调用Done/Fail,javascript,ajax,jquery,jquery-deferred,Javascript,Ajax,Jquery,Jquery Deferred,我用我的自定义实现覆盖JQuery Ajax XHR对象,以便“伪造”服务器的请求和服务器的响应 我创建了一个简单的示例,展示了我在JS fiddle中试图实现的目标——在JS部分,我定义了一个非常简单的全局sendAjax函数,该函数假设使用$.ajax调用服务器: window.sendAjax = function() { var jqxhr = $.ajax({ url: "/ServerResource.txt" }); jqxhr.done

我用我的自定义实现覆盖JQuery Ajax XHR对象,以便“伪造”服务器的请求和服务器的响应

我创建了一个简单的示例,展示了我在JS fiddle中试图实现的目标——在JS部分,我定义了一个非常简单的全局sendAjax函数,该函数假设使用$.ajax调用服务器:

window.sendAjax = function() {

    var jqxhr = $.ajax({
        url: "/ServerResource.txt"
    });

    jqxhr.done(function (data, textStatus, jqXHR) {
        //this is never called
        alert("done !")
    });

    jqxhr.fail(function (jqXHR, textStatus, errorThrown) {
        //this is never called
        alert("fail " + errorThrown);
    });
}
此外,我还尝试使用自己的xhr替换JQuery ajax xhr对象,在这里,我用自己的实现替换了“send”方法,该实现假设返回一些数据,而不是XHTPrequest——对于现在的JSFIDLE,我将立即返回“success”响应。问题是“完成”或“失败”功能根本不会对我的响应作出反应:

以下是我对XHR的重新定义

//reload jquery ajax
var originalXhr = jQuery.ajaxSettings.xhr;
$.ajaxSetup({
    xhr: function () {
        var req = originalXhr();
        var deferred = $.Deferred();
        var promise = deferred.promise(req);
        if (req) {
            // Add your progress handler
            var _send = req.send;
            req.send = function (headers, complete) {
                //the one below does not work  
                setTimeout(function () {
                    deferred.resolve("Resolve promise", "OK", req);
                }, 200);
            }
            var _open = req.open;
            req.open = function () {
                console.log('OPEN AJAX called');
            }
        }

        return promise;
    }
});
我可能做了一些事情,但延迟美元并没有按照我习惯的方式起作用,但我目前还不知道到底出了什么问题。 这是JS小提琴-也许你有一些想法


致以最良好的祝愿,Artem

推迟返回;而不是回报承诺;jQuery.ajax调用没有有效的done选项,因此请删除该选项,看看会发生什么因为它没有ajax方法,所以不会工作——这是一个承诺,它用done、fail、always方法扩展ajax。我还编辑了上面的代码,删除了一个额外的done,但它也不能解决问题