2011-02-08 12 views
0

私は最初の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(){}; 
    } 
    } 

答えて

3

あなたは常に同期のネットワーク要求を行うことを避ける必要があります応答。ネットワークがあなたのために速いかもしれないという理由だけで、すべてのユーザーにとって高速になるとは思わないでください。

+0

Fine。という事は承知しています。さて、あなたは私の場合にそれをコーディングしますか?私は主にalertContents()からdoRequest()を呼び出すことに興味があります – AntonioHerraizS

+0

呼び出しが互いに依存している場合(順序は重要です)、はい、それは私がやる方法です。 – sdwilsh

+0

呼び出しが互いに依存している場合(順序が重要)、まだ**非同期要求を使用する必要があります。最初のリクエストに渡されたコールバック関数からの2番目のリクエストを作成するだけです。これは、非同期要求の通常の使用です。この時点で、[promiseインタフェース](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)を使用すると便利です。 – Makyen

関連する問題