私は最初のFirefoxアドオンで非常に簡単なことをしようとしていますが、重要な部分は次のとおりです:Firefox拡張機能:XMLHttpRequestを使用した複数のリクエスト。非同期を使用するかどうか
ステップ1)いくつかのデータを取得するために外部APIを呼び出します。
ステップ2)もう一度取得するために、最初に取得したデータを使用してAPIを再度呼び出します。
ここでは、最初に、同期モードでXMLHttpRequestを使用して実装しました。これは、ステップ2を待つ必要があると思っていました。 API呼び出しを処理した関数への2回の呼び出しで、XMLHttpRequestを使用して応答を解析しました。ファイン。
その後、私はMozilla Development Networkのさまざまなドキュメントにアクセスし、XMLHttpRequestを非同期モードで使用するよう勧めました。
multiple XMLHttpRequestsなどで私の実装をベースにして、私は以下のコードを思いついた。
私の質問です:これは正しい方法ですか?同期モードの使用に戻るべきですか?あなたが得るまで、それが機能してからGUIをブロックするよう、それはこのように動作しますが、それはちょうどあなたが使用する正しい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(){};
}
}
Fine。という事は承知しています。さて、あなたは私の場合にそれをコーディングしますか?私は主にalertContents()からdoRequest()を呼び出すことに興味があります – AntonioHerraizS
呼び出しが互いに依存している場合(順序は重要です)、はい、それは私がやる方法です。 – sdwilsh
呼び出しが互いに依存している場合(順序が重要)、まだ**非同期要求を使用する必要があります。最初のリクエストに渡されたコールバック関数からの2番目のリクエストを作成するだけです。これは、非同期要求の通常の使用です。この時点で、[promiseインタフェース](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)を使用すると便利です。 – Makyen