寻找可重用的异步 XMLRequest 函数

Looking for a reusable async XMLRequest-Function

我正在创建一个主要使用游戏的客户端网络应用程序-API 来显示统计数据和库存。 这个应用程序需要一个接一个地执行几个获取请求,我正在尝试考虑一个简单的函数,它可以处理多个不同的请求,并且总是只返回响应,同时等待上一个请求完成。

我当前的函数不等待请求完成,所以 $temp 仍未定义。

function BClick(){
        rqURL = 'https://endpoint';
        temp = getRequest(rqURL);
        console.log(temp);
}

function getRequest(URL) {
    akey = '000';
    var xr = new XMLHttpRequest();
    xr.open("GET", URL);
    xr.setRequestHeader("X-API-Key",akey);

    xr.onreadystatechange = () => {
        if (xr.readyState === 4) {
            xh = JSON.parse(xr.responseText);
            return xh;
        }
    };
    xr.send();
}

我怎样才能使所有这些异步并等待响应完成? 我试过研究 'async function(){}' 但这需要我将 get-request 放在第一个函数中。这将消除可重用性,因为我需要以不同的方式处理响应。

目前我正在考虑一个在特定变量获取数据时执行的函数,因此它只会注意每个响应变量。肯定有 'nicer' 方法,我不知道。

您可以使用简单的回调或承诺。

有承诺

function getRequest(URL, akey) {
  return new Promise((resolve, reject) => {
    const request = new XMLHttpRequest();
    request.open('GET', URL);
    request.setRequestHeader('X-Api-Key', akey);
    request.onload = () => {
      if (request.status === 200) {
        resolve(request.response);
      } else {
        reject(Error(request.statusText));
      }
    };
    request.onerror = () => {
      reject(Error('Network Error'));
    };
    request.send();
  });
}

// Use with 'then' chain

getRequest('url', '000').then(function(responseData) {
  // parse data here if necessary
  console.log(responseData);
}).catch(function(error) {
  // handle error
  console.log(error);
});

但是,浏览器 fetch API 已经具备此功能,因此您可以改用它。

有回调

function getRequest(URL, akey, successCallback, failCallback) {
  const request = new XMLHttpRequest();
  request.open('GET', URL);
  request.setRequestHeader('X-Api-Key', akey);
  request.onload = () => {
    if (request.status === 200) {
      successCallback(request.response);
    } else {
      failCallback(Error(request.statusText));
    }
  };
  request.onerror = () => {
    failCallback(Error('Network Error'));
  };
  request.send();
}

// usage
getRequest(
  'url',
  '000',
  function (responseData) {
    // use data
    console.log(responseData);
  },
  function (error) {
    // handle error
    console.log(error);
  },
);

这些是针对您的具体情况,但您可以传递更多参数并根据需要进行改进。