Javascript XMLHttpRequest和Q
我使用的是angular,在包装XMLHttpRequest时遇到了问题,价格为$q 我还使用offline.js库检查用户是否在线。向fav.ico发出ajax请求后,它会将var“status”的状态更改为down\up。它在离线调用后进行ajax调用。check() Offline.check()返回要包装为$q的XMLHttpRequest,并承诺在获取结果后使用它 我试过:Javascript XMLHttpRequest和Q,javascript,angularjs,xmlhttprequest,angular-promise,Javascript,Angularjs,Xmlhttprequest,Angular Promise,我使用的是angular,在包装XMLHttpRequest时遇到了问题,价格为$q 我还使用offline.js库检查用户是否在线。向fav.ico发出ajax请求后,它会将var“status”的状态更改为down\up。它在离线调用后进行ajax调用。check() Offline.check()返回要包装为$q的XMLHttpRequest,并承诺在获取结果后使用它 我试过: $q( Offline.check() ).then(function(response){ cons
$q( Offline.check() ).then(function(response){
console.log(response);
});
但得到错误:$q:norslvr
没有传递给$Q的解析器函数
offline.js的有趣部分
Offline.check = function() {
Offline.trigger('checking');
return Offline.checks['xhr']();
};
Offline.checks.xhr = function() {
var e, xhr;
xhr = new XMLHttpRequest;
xhr.offline = false;
xhr.open('HEAD', Offline.getOption('checks.xhr.url'), true);
if (xhr.timeout != null) {
xhr.timeout = Offline.getOption('checks.xhr.timeout');
}
checkXHR(xhr, Offline.markUp, Offline.markDown);
try {
xhr.send();
} catch (_error) {
e = _error;
Offline.markDown();
}
return xhr;
};
checkXHR = function(xhr, onUp, onDown) {
var checkStatus, _onerror, _onload, _onreadystatechange, _ontimeout;
checkStatus = function() {
if (xhr.status && xhr.status < 12000) {
return onUp();
} else {
return onDown();
}
};
if (xhr.onprogress === null) {
_onerror = xhr.onerror;
xhr.onerror = function() {
onDown();
return typeof _onerror === "function" ? _onerror.apply(null, arguments) : void 0;
};
_ontimeout = xhr.ontimeout;
xhr.ontimeout = function() {
onDown();
return typeof _ontimeout === "function" ? _ontimeout.apply(null, arguments) : void 0;
};
_onload = xhr.onload;
return xhr.onload = function() {
checkStatus();
return typeof _onload === "function" ? _onload.apply(null, arguments) : void 0;
};
} else {
_onreadystatechange = xhr.onreadystatechange;
return xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
checkStatus();
} else if (xhr.readyState === 0) {
onDown();
}
return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
};
}
};
Offline.check=function(){
Offline.trigger('checking');
离线返回。检查['xhr']();
};
Offline.checks.xhr=函数(){
变量e,xhr;
xhr=新的XMLHttpRequest;
xhr.offline=false;
open('HEAD',Offline.getOption('checks.xhr.url'),true);
如果(xhr.timeout!=null){
xhr.timeout=Offline.getOption('checks.xhr.timeout');
}
检查xhr(xhr,Offline.markUp,Offline.markDown);
试一试{
xhr.send();
}捕获(_错误){
e=_错误;
Offline.markDown();
}
返回xhr;
};
checkXHR=函数(xhr、onUp、onDown){
var检查状态、\u onerror、\u onload、\u onreadystatechange、\u ontimeout;
checkStatus=函数(){
如果(xhr.status&&xhr.status<12000){
返回onUp();
}否则{
返回onDown();
}
};
if(xhr.onprogress==null){
_onerror=xhr.onerror;
xhr.onerror=函数(){
onDown();
返回类型为_onerror==“函数”?\u onerror.apply(null,参数):void 0;
};
_ontimeout=xhr.ontimeout;
xhr.ontimeout=函数(){
onDown();
返回类型为_-ontimeout==“函数”?\u-ontimeout.apply(null,参数):void 0;
};
_onload=xhr.onload;
返回xhr.onload=function(){
检查状态();
返回类型为_onload==“function”?_onload.apply(null,参数):void 0;
};
}否则{
_onreadystatechange=xhr.onreadystatechange;
返回xhr.onreadystatechange=function(){
if(xhr.readyState==4){
检查状态();
}else if(xhr.readyState==0){
onDown();
}
返回类型为_onreadystatechange==“函数”?\u onreadystatechange.apply(null,参数):void 0;
};
}
};
为什么不直接使用$http
?我无法编辑offline.js库的可能副本,但我需要它,所以我需要另一个解决方案。你说“你需要它”是什么意思?显然,你需要一些不同的东西。为什么你不能简单地用一个编辑过的版本来替换它(例如,Offline.checks.xhr
返回一个承诺)?因为在外部库中进行黑客攻击是一种不好的做法,当然我可以提出pull请求,并希望它对某人有用。