0

私は小さなプロジェクトで苦労しているアマチュア プログラマーです。Google スプレッドシートからデータを取得し、データを変更して、(Google チャート API を使用して) Google チャートを作成したいと考えています。

以下のコードは Firefox で完全に機能しますが、Chrome と IE では、handleQueryResponse(e) 関数の範囲外で dataTable を使用できません。最初に考えたのは、handleQueryResponse(e) 関数から dataTable を返すことでしたが、それは関数 (.send()) 内で呼び出されます。

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

function getDataTable(link) {
     var dataTable= new google.visualization.DataTable();
     var queryTrip = new google.visualization.Query(link);
     queryTrip.send(handleQueryResponse);
     function handleQueryResponse(response) {

         if (response.isError()) {

             alert('Error in query: ' + response.getMessage() + ' ' + response.getDetailedMessage());
             return;
         }

         dataTable = response.getDataTable();
         // I can verify this has the data through debugging in Chrome  
     }
     // Outside of the function handleQueryResponse the dataTable is gone
    return dataTable;
 }
4

2 に答える 2

3

非同期関数 ( queryTrip.send)を呼び出す関数は、その非同期関数呼び出しの結果に依存するデータを返すことも、データを使用することもできません

そのデータは、コールバック関数内、およびそのコールバックによってその後呼び出されるその他の関数内でのみ使用できます。

于 2012-05-09T15:45:46.843 に答える
0

felix が述べたように、おそらく非同期です。つまり、関数 getDataTable のスコープ内で即座に実行されないため、handleQueryResponse が実行されるまでに変数が存在しなくなります。

handleQueryResponse が書き込むことができるよりも、 dataTable の変数をそのスコープ外 (グローバル スコープ内) に置くことができます。

ただし、dataTable の準備が整った後に実行する必要がある関数は、handleQueryResponse 関数内から開始する必要があります。最善の方法は、dataTable の準備ができた後で、ある種のイベント ドリブン処理を使用することです。

于 2012-05-09T15:34:17.760 に答える