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

时间:2011-02-08 21:56:41

标签: javascript ajax firefox-addon xmlhttprequest

我正在尝试一些非常简单的第一个Firefox附加组件,重要的部分是:

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

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

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

基于multiple XMLHttpRequests和其他人的实施,我提出了以下代码。

我的问题是:这是正确的方法吗?我应该回到使用同步模式吗?它的工作方式与此类似,但它并没有让我觉得你会使用正确的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(){};
    }
  }

1 个答案:

答案 0 :(得分:3)

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