【发布时间】:2023-04-09 03:35:01
【问题描述】:
我正在使用 ajax 和迭代承诺来为 ajax 调用创建一个抽象版本。下面的代码工作正常。
function ajax(url){
var xhr = {
rq : function (method, url){
var prom = new Promise(function (resolve, reject){
var client = new XMLHttpRequest();
//only accept
client.open(method,url,true);
client.send();
client.onload = function (){
if(this.status == 200){
if(this.response == "1"){
reject(this.response);
}
else{
resolve(this.response);
}
}
else{
reject(this.statusText);
}
};
});
return prom;
}
};
return {
'get' : function(){
return xhr.rq('GET', url);
}
};
}
但是我想抽象 ajax.onload 上的函数作为回调传递,我正在考虑这样的事情:
function ajax(url, checker){
var xhr = {
rq : function (method, url){
var prom = new Promise(function (resolve, reject){
var client = new XMLHttpRequest();
//only accept
client.open(method,url,true);
client.send();
client.onload = checker;
};
});
return prom;
}
};
return {
'get' : function(){
return xhr.rq('GET', url);
}
};
}
function chk1(){
if(this.status == 200){
if(this.response == "1"){
reject(this.response);
}
else{
resolve(this.response);
}
}
else{
reject(this.statusText);
}
}
不幸的是,我收到了解决和拒绝未知的错误。我有点知道问题只是在 chk1 内不知道承诺。但是,我不确定如何解决它。
我希望能够这样称呼它:
Promise.all([ajax(u,chk1).get(),ajax(v,chk1).get()])
.then(callback.success)
.catch(callback.error);
亲切的问候
【问题讨论】:
-
您可能需要像
client.onload = checker.bind(this,resolve,reject)这样才能在检查器回调中引用 promise 的 resolve 和 reject 回调..
标签: javascript ajax callback promise