Расширение Firefox: несколько запросов с XMLHttpRequest. Использовать асинхронно или нет? - PullRequest
0 голосов
/ 09 февраля 2011

Я пытаюсь сделать что-то очень простое для своего первого дополнения Firefox, важная часть:

Шаг 1) Вызовите внешний API для получения некоторых данных.
Шаг 2) Снова вызовите этот API с данными, полученными в первый раз, чтобы получить больше.

Теперь я впервые реализовал это с использованием XMLHttpRequest в синхронном режиме, поскольку я думал, что необходимость ждать шага 2 вынудила меня сделать это таким образом. Два вызова функции, которые имели дело с вызовом API, использовали XMLHttpRequest и проанализировали ответ. Хорошо.

Затем я наткнулся на различные документы в Mozilla Development Network, которые побуждают вас использовать XMLHttpRequest в асинхронном режиме, поэтому я попытался.

Основывая мою реализацию на множественных запросах XMLHttp и других, я пришел с кодом ниже.

Мой вопрос: это правильный способ сделать это? Должен ли я вернуться к использованию синхронного режима? Это работает так, но меня не устраивает правильный шаблон 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 Ответ

3 голосов
/ 09 февраля 2011

Вы всегда должны избегать выполнения синхронных сетевых запросов, так как это заблокирует работу графического интерфейса, пока вы не получите ответ.Просто потому, что сеть может быть быстрой для вас, вы не должны предполагать, что она будет быстрой для всех ваших пользователей.

...