Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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 ES6异步承诺_Javascript_Ecmascript 6_Es6 Promise - Fatal编程技术网

Javascript ES6异步承诺

Javascript ES6异步承诺,javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,我还是ES6的初学者。 我试图创建一个函数,该函数在发送http(s)请求时使用一个逻辑发送http(s)请求。如果有5个或更多正在进行的请求,您必须等到一个 其中一项完成后,您可以处理下一个请求。 当响应代码不是200时,您需要重试3次。如果响应代码在 重试3次仍然不是200次,那么应该执行错误函数。 我还想接收响应体的JSON数据作为函数参数 function httpGet(url) { return new Promise( function (resolve,

我还是ES6的初学者。 我试图创建一个函数,该函数在发送http(s)请求时使用一个逻辑发送http(s)请求。如果有5个或更多正在进行的请求,您必须等到一个 其中一项完成后,您可以处理下一个请求。 当响应代码不是200时,您需要重试3次。如果响应代码在 重试3次仍然不是200次,那么应该执行错误函数。 我还想接收响应体的JSON数据作为函数参数

function httpGet(url) {
    return new Promise(
        function (resolve, reject) {
            const request = new XMLHttpRequest();
            request.onload = function () {
                if (this.status === 200) {
                    // Success
                    resolve(this.response);
                } else {
                    // Something went wrong (404 etc.)
                    reject(new Error(this.statusText));
                }
            };
            request.onerror = function () {
                reject(new Error(
                    'XMLHttpRequest Error: '+this.statusText));
            };
            request.open('GET', url);
            request.send();
        });
}
这就是我到目前为止所做的。
谢谢,这里是promise回调的常规队列:

// Helper to run a callback when a promise either resolves, or rejects.
function fin(promise, callback){
  return promise.then(
    value => (callback(), Promise.resolve(value)),
    error => (callback(), Promise.reject(error))
  );
}

function makeQueue(maxParallel){
  const queue = [];
  let inProgress = 0;

  // Run the oldest queued task.
  function run(){
    const {resolve, reject, callback} = queue.shift();

    inProgress++;
    return fin(callback(), () => inProgress--).then(resolve, reject);
  }

  // If more tasks can run in parallel, start them
  function dequeue(){
    if (queue.length > 0 && inProgress < maxParallel) run().then(dequeue);
  }

  return function(callback){
    return new Promise((resolve, reject) => {
      queue.push({resolve, reject, callback});
      dequeue();
    });
  }
}
然后使用重试逻辑调用:

// Call httpGet with queued processing, with the request tried
// up to three times.
function httpGetWithRetry(url){
  let result = Promise.reject();

  for (var i = 0; i < 3; i++){
    result = result.catch(() => httpGetWithQueue(url));
  }
  return result;
}  
//使用排队处理调用httpGet,并尝试请求
//最多三次。
函数httpGetWithRetry(url){
让结果=Promise.reject();
对于(变量i=0;i<3;i++){
result=result.catch(()=>httpGetWithQueue(url));
}
返回结果;
}  

这里是promise回调的常规队列:

// Helper to run a callback when a promise either resolves, or rejects.
function fin(promise, callback){
  return promise.then(
    value => (callback(), Promise.resolve(value)),
    error => (callback(), Promise.reject(error))
  );
}

function makeQueue(maxParallel){
  const queue = [];
  let inProgress = 0;

  // Run the oldest queued task.
  function run(){
    const {resolve, reject, callback} = queue.shift();

    inProgress++;
    return fin(callback(), () => inProgress--).then(resolve, reject);
  }

  // If more tasks can run in parallel, start them
  function dequeue(){
    if (queue.length > 0 && inProgress < maxParallel) run().then(dequeue);
  }

  return function(callback){
    return new Promise((resolve, reject) => {
      queue.push({resolve, reject, callback});
      dequeue();
    });
  }
}
然后使用重试逻辑调用:

// Call httpGet with queued processing, with the request tried
// up to three times.
function httpGetWithRetry(url){
  let result = Promise.reject();

  for (var i = 0; i < 3; i++){
    result = result.catch(() => httpGetWithQueue(url));
  }
  return result;
}  
//使用排队处理调用httpGet,并尝试请求
//最多三次。
函数httpGetWithRetry(url){
让结果=Promise.reject();
对于(变量i=0;i<3;i++){
result=result.catch(()=>httpGetWithQueue(url));
}
返回结果;
}  

请展示您迄今为止所做的尝试。我创建了一个新的承诺,但我坚持定义正在进行的请求的第一部分
请展示您迄今为止所做的尝试
-同上,如果您想从其他开发人员处获得帮助,您必须展示资金。我们在这里帮助您,而不是为您编写代码。我添加了一个示例,请展示您迄今为止所做的尝试。我创建了一个新的承诺,但我坚持在定义持续请求的第一部分
请展示您迄今为止所做的尝试
-同上,如果您想从其他开发人员那里获得帮助,您必须展示资金。我们在这里是为了帮助你,而不是为你编写代码。我添加了一个示例