Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 管理XHR承诺_Javascript_Xmlhttprequest_Promise - Fatal编程技术网

Javascript 管理XHR承诺

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

所以我一直在研究如何在承诺中包装XHR。我面临的问题是如何管理它们。有没有一种方法可以在Promise的.then()中管理请求,而不是在Promise本身的主体中

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对象。我想您也可以将属性附加到承诺本身上,如果您没有在创建时的同一行返回它……如果您想使请求可中止,您必须返回多个承诺。