javascript - 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, 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();
    });
  }
}

然后使用queue来排队httpGet:

const queue = makeQueue(5);

// Queue up httpGet calls.
function httpGetWithQueue(url){
  return queue(() => httpGet(url));
}

然后使用重试逻辑调用它:

// 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;
}  

关于javascript - ES6 异步 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196556/

相关文章:

javascript - 在 ES6/react 中导出函数

javascript - 为什么需要方括号来将 Javascript 中 Map 的所有元素字符串化?

javascript - Angular 8 - 尝试比较 '[object Object]' 时出错。仅允许数组和可迭代对象

javascript - 当运行时错误发生时,如何通过原生 Promise 触发全局 onError 处理程序?

javascript - 如何使用 fetch 进行同步请求?

javascript - 我如何(有效地)链接我的 promise ,返回一个有值(value)的数组而不是 promise ?

javascript - 我可以在 Javascript 的 if 语句中调用一个函数吗?

javascript - 如何监控 Javascript 对象的新属性设置

javascript - Google Speech API - 长音频文件的服务器不可用错误

javascript - ESLint prefer-arrow-callback on array.map