Javascript 管理XHR承诺
所以我一直在研究如何在承诺中包装XHR。我面临的问题是如何管理它们。有没有一种方法可以在Promise的.then()中管理请求,而不是在Promise本身的主体中Javascript 管理XHR承诺,javascript,xmlhttprequest,promise,Javascript,Xmlhttprequest,Promise,所以我一直在研究如何在承诺中包装XHR。我面临的问题是如何管理它们。有没有一种方法可以在Promise的.then()中管理请求,而不是在Promise本身的主体中 var i = 0; var requests = []; while(i < 10) { mkPromise().then(function (response) { console.log(response) // handle fulfilled requests }) .catch(funct
var i = 0;
var requests = [];
while(i < 10) {
mkPromise().then(function (response) {
console.log(response) // handle fulfilled requests
})
.catch(function (error) {
console.log(error)
})
.then(function (response) {
console.log(requests) // manage requests here
});
i++
}
function mkPromise () {
var url = 'http://example.com';
return new Promise(function(resolve, reject) {
// Do the usual XHR stuff
var req = new XMLHttpRequest();
req.open('GET', url);
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.onload = function() {
// This is called even on 404 etc
// so check the status
if (req.status == 200) {
// Resolve the promise with the response text
resolve(req.response);
// Do this in the final .then() instead of here so that it's managed for errors as well without duplicating removal process
var index = requests.indexOf(req);
requests.splice(index,1)
}
else {
// Otherwise reject with the status text
// which will hopefully be a meaningful error
reject(Error(req.statusText));
}
};
// Handle network errors
req.onerror = function() {
reject(Error("Network Error"));
};
requests.push(req)
// Make the request
req.send();
});
}
var i=0;
var请求=[];
而(i<10){
mkPromise().then(函数(响应){
console.log(response)//处理满足的请求
})
.catch(函数(错误){
console.log(错误)
})
.然后(功能(响应){
console.log(请求)//在此处管理请求
});
我++
}
函数mkPromise(){
var url='1〕http://example.com';
返回新承诺(功能(解决、拒绝){
//做通常的XHR工作
var req=新的XMLHttpRequest();
请求打开('GET',url);
setRequestHeader(“内容类型”,“应用程序/json;字符集=UTF-8”);
req.onload=函数(){
//这甚至在404上也被称为
//所以检查一下状态
如果(请求状态==200){
//用响应文本解析承诺
解决(请求响应);
//在final.then()中执行此操作,而不是在此处执行此操作,以便在不重复删除过程的情况下管理错误
var index=requests.indexOf(req);
请求.拼接(索引,1)
}
否则{
//否则,拒绝状态文本
//这将有望成为一个有意义的错误
拒绝(错误(请求状态文本));
}
};
//处理网络错误
req.onerror=函数(){
拒绝(错误(“网络错误”);
};
请求推送(req)
//提出请求
请求发送();
});
}
你所说的“管理”是什么意思?我想存储请求,以便在必要时(如果时间太长)中止它们,或者在Promise中查看请求。你的mkPromise
功能应该只处理一个请求。它根本不需要知道请求
数组。将参数添加到mkPromise()
以传入配置。您还可以返回一个包含承诺和其他内容的对象,比如xhr对象。我想您也可以将属性附加到承诺本身上,如果您没有在创建时的同一行返回它……如果您想使请求可中止,您必须返回多个承诺。