Я пытаюсь сделать что-то очень простое для своего первого дополнения 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(){};
}
}