0

是否可以将原始XMLHttpRequest 或 XDomainRequest 转换为 jQuery Deferred 对象(或将其包装在 jQuery Deferred 对象中)?

当我说raw时,我的意思是对象是直接使用new XMLHttpRequest()or创建new XDomainRequest()的,而不是使用 jQuery 的便利函数($.ajax,$.get等)

我正在尝试这样做,因为在我的页面中,在加载 jQuery 之前手动创建了一个 XMLHttpRequest(或 XDomainRequest),然后我想将其转换为 Deferred 对象并在$.when加载 jQuery 后在调用中使用:

// raw XMLHttpRequest created here, with onreadystatechange attached.
window.my_request = new XMLHttpRequest();
// ...
window.my_request.send();

// Load jQuery, using head.js or require.js
head.js(
    '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js',
    '//mydomain/my-script.js'
);

// Inside my-script.js, I want to turn window.my_request into
// a jQuery Deferred object and use it in a $.when call.
4

2 回答 2

1

你可能可以做这样的事情来给你一个承诺,这是一个 jQuery.ajax 承诺的非常粗略的模拟。

window.my_request = new XMLHttpRequest();
// ...
window.my_request.send();

// Load jQuery, using head.js or require.js
head.js(
    '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js',
    '//mydomain/my-script.js'
);

// ...

var dfrd = $.Deferred();

window.my_request.onreadystatechange = function() {
    if (window.my_request.readyState==4) {
        if (window.my_request.status==200) {
        //or possibly
        //if (window.my_request.status >= 200 && window.my_request.status < 300 || window.my_request.status === 304) {
            dfrd.resolve(window.my_request.responseText, window.my_request.statusText, window.my_request);
        }
        else (
            dfrd.reject(window.my_request, window.my_request.statusText);
        )
    }
}

window.my_request_promise = dfrd.promise();
于 2013-10-16T05:53:26.770 回答
0

好吧,我刚刚查看了源代码,不幸的是他们没有模块化包装XMLHttpRequest对象的过程,并且该过程似乎被封装在$.ajax函数本身中。

查看从第 428 行开始的源代码,看看它们是如何包装它的。

不幸的是,您将不得不自己包装它。

注意:我宁愿看一下在XMLHttpRequest加载 jQuery 之前需要实例化对象的原因,以确保它不仅仅是一个设计问题。

于 2013-10-16T02:48:25.510 回答