1

inject.jsを介してページにHTMLフォームを挿入するChrome拡張機能を作成しています。クエリが入力され、ボタンが押されると、background.jsを介してAPI呼び出しが行われます。その後、コンテンツはinject.jsスクリプトに戻され、処理されます。

inject.jsを介して最初に電話をかけようとすると、次のエラーが発生します。

    Error in event handler for 'undefined': fetchResult is not defined ReferenceError: searchResult is not defined

奇妙なことに、少し待ってもう一度押すと、クエリがフェッチされます。

クエリをフェッチするのに少し時間がかかるため、最初はfetchresultが未定義であると思われますが、これを修正する方法がわかりません。

inject.js:

    function fetch() {

    var fetchResult;

    var fetchquery = document.getElementById('field').value;

    chrome.extension.sendMessage({greeting: fetchquery}, function(response) {
             fetchResults = response.farewell
            constructHTML(fetchResultsResults)      

        });
    };

background.js:

    function loadXMLDoc(query)
    {

   if (query){
    // new cross origin XML request

   xmlhttp=new XMLHttpRequest();
   xmlhttp.onreadystatechange=function()
    {
     if (xmlhttp.readyState==4 && xmlhttp.status==200)
      {
         fetchResult = JSON.parse(xmlhttp.responseText);
         }
     }

   xmlhttp.open("GET","http://XXXXXXXXXXXXXXX&q="+query, true);
   xmlhttp.send();

   return fetchResult;

   } else {

       return "noquery";
    }
    };

    chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
       if (loadXMLDoc(request.greeting) != "noquery"){
            sendResponse({farewell: loadXMLDoc(request.greeting)})
            }
    });

どんな助けでも大歓迎です!

4

1 に答える 1

4

XMLHttpRequestは非同期であるため、代わりにreturn fetchResultコールバックを呼び出して結果を渡す必要があります。次に例を示します。

   function loadXMLDoc(query, callback)
   {

   if (query){
    // new cross origin XML request

   xmlhttp=new XMLHttpRequest();
   xmlhttp.onreadystatechange=function()
    {
     if (xmlhttp.readyState==4)
      {
         if(xmlhttp.status==200)
         {
           fetchResult = JSON.parse(xmlhttp.responseText);
           callback(fetchResult);
         } else {
           callback("noquery");
         }
      }
     }

   xmlhttp.open("GET","http://XXXXXXXXXXXXXXX&q="+query, true);
   xmlhttp.send();

   } else {

       callback("noquery");
    }
    };

    chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
            loadXMLDoc(request.greeting, function(fetchResult) {
              if (fetchResult != "noquery")
                sendResponse({farewell: fetchResult})
              else
                sendResponse({});
            });
            return true; // See the description of https://developer.chrome.com/extensions/extension.html#property-onMessage-sendResponse.
    });
于 2013-03-25T01:14:02.443 に答える