Javascript Firefox扩展:使用XMLHttpRequest的多个请求。是否使用异步?

Javascript Firefox扩展:使用XMLHttpRequest的多个请求。是否使用异步?,javascript,ajax,firefox-addon,xmlhttprequest,Javascript,Ajax,Firefox Addon,Xmlhttprequest,我正在为我的第一个Firefox插件尝试一些非常简单的东西,重要的部分是: 步骤1)调用外部API以检索某些数据。 步骤2)使用第一次检索到的数据再次调用该API以获取更多数据 现在,我首先在同步模式下使用XMLHttpRequest实现它,因为我认为等待步骤2的需要迫使我这样做。对处理API调用的函数的两个调用,使用XMLHttpRequest并解析响应。好的 然后我访问了Mozilla开发网络中的各种文档,它们鼓励您在异步模式下使用XMLHttpRequest,所以我尝试了 基于我的实现和其

我正在为我的第一个Firefox插件尝试一些非常简单的东西,重要的部分是:

步骤1)调用外部API以检索某些数据。
步骤2)使用第一次检索到的数据再次调用该API以获取更多数据

现在,我首先在同步模式下使用XMLHttpRequest实现它,因为我认为等待步骤2的需要迫使我这样做。对处理API调用的函数的两个调用,使用XMLHttpRequest并解析响应。好的

然后我访问了Mozilla开发网络中的各种文档,它们鼓励您在异步模式下使用XMLHttpRequest,所以我尝试了

基于我的实现和其他实现,我提出了下面的代码

我的问题是:这是正确的方法吗?我应该回到使用同步模式吗?它的工作原理是这样的,但我觉得它不是您将使用的正确AJAX模式

  // first call
  var username = foo;
  var password = bar;
  var startOffset = 0; // initial value
  var url = encodeURIComponent('https://theapiurl.com/query=' + startOffset);
  doRequest();

  function doRequest() {
    makeRequest(url, username, password);
  }

  function makeRequest(url, username, password) {
    var http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
      http_request.overrideMimeType('text/xml');
    }
    if (!http_request) {
      alert('Cannot create XMLHTTP instance');
      return false;
    }
    http_request.onreadystatechange = function() { 
       alertContents(http_request);
    };
    http_request.open('GET', url, true, username, password);
    http_request.send(null);
  }  

  function alertContents(http_request) {
    if (http_request.readyState == 4) {
      if (http_request.status == 200) {
        if (startOffset == 0) {
          startOffset = 45; // this value would be extracted from 'http_request'
          url = encodeURIComponent('https://theapiurl.com/query=' + startOffset);
          // second call, parameter startOffset has changed
          doRequest();
        } else {
        }
      } else {
        alert('There was a problem with the request.');
      }
      http_request.onreadystatechange = function fnNull(){};
    }
  }

您应该始终避免执行同步网络请求,因为它会阻止GUI运行,直到您得到响应为止。仅仅因为网络对您来说可能很快,您不应该假设它对所有用户来说都很快。

您应该始终避免执行同步网络请求,因为它会阻止GUI运行,直到您得到响应为止。仅仅因为网络对你来说可能很快,你不应该认为它对你所有的用户来说都很快。

好。我明白。现在,你能在我的情况下这样编码吗?我最感兴趣的是从alertContents()调用doRequest(),如果调用相互依赖(如中所示,顺序很重要),是的,我会这样做。如果调用相互依赖(如中所示,顺序很重要),那么您仍然应该使用异步请求。您只需从传递给第一个请求的回调函数发出第二个请求。这是异步请求的正常使用。此时,使用可能有用。很好。我明白。现在,你能在我的情况下这样编码吗?我最感兴趣的是从alertContents()调用doRequest(),如果调用相互依赖(如中所示,顺序很重要),是的,我会这样做。如果调用相互依赖(如中所示,顺序很重要),那么您仍然应该使用异步请求。您只需从传递给第一个请求的回调函数发出第二个请求。这是异步请求的正常使用。在这一点上,使用可能是有用的。