0

変数を定義する関数があり、その値を次の関数で使用したいと考えています。各関数には独自のクエリがあります。クエリを1つの関数に結合する必要があると思いますが、その方法がわからないか、最初のクエリでグローバル変数を設定して、2番目の関数で参照できるようにします。

私はそのグローバル変数を読んでいますが、それらは良い習慣ではないと言っています。ある関数から次の関数に変数を再利用する方法、または 2 つのクエリを結合する方法、または別の JS メソッドを検討する方法を教えてもらえますか?

google.setOnLoadCallback(queryValue1);
function queryValue1 () {
var query2 = new google.visualization.Query('https://spreadsheets.google.com/spreadsheet/tq?range=A2:A17&key=0AhCv9Xu_eRnSdFNhSzNQUFd3b1ZfRHgtQURINFpzeGc&gid=9');
query2.send(function (response) {
    if (response.isError()) {
        alert('Error in query2: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
    }
    var data1 = response.getDataTable();

    // fetch the data from range cell (row, column) into the span "bx"
    for (var z = 0; z <= 15; z++) {
    document.getElementById('a' + (z + 22)).innerHTML = data1.getValue(z, 0);
}
});
}

google.setOnLoadCallback(queryValue3);
function queryValue3 () {
var query3 = new google.visualization.Query('https://spreadsheets.google.com/spreadsheet/tq?range=B2:B17&key=0AhCv9Xu_eRnSdFNhSzNQUFd3b1ZfRHgtQURINFpzeGc&gid=10');
query3.send(function (response) {
    if (response.isError()) {
        alert('Error in query3: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
    }
var data3 = response.getDataTable();
var m1 = data3.getValue(0, 0);
var red22 = "<span style='color:#ff0000' ";
var yellow22 = "<span style='color:#FF9900' ";
var green22 = "<span style='color:#009900' ";
if (m1 <= 70)
{
m1 = red22;
}
else if (71 === m1 && m1 <= 89)
{
m1 = yellow22;
}
else if (m1 >=90)
{
m1 = green22;
}
console.log ("m1= " + m1)
var m1 = (m1 + a22 + "</span>");
console.log ("m1= " + m1)
});
}

ありがとうございました...

4

1 に答える 1

1

現状では、2 つの本質的に並列な非同期ネットワーク呼び出し (Query.send()呼び出し) を作成しています。どちらが最初に返されるか (またはどちらが失敗するか) はわかりません。そのため、グローバル変数を使用するか他のものを使用するかに関係なく、一方のコールバックを他方からのデータに依存することは信頼できず、悪い考えです。

おそらく、2 つの非同期呼び出しを連鎖させたいだけだと思う​​ので、次のような形を試してみてください。

google.setOnLoadCallback(queryValue1);
function queryValue1 () {
  var query2 = new google.visualization.Query('https://spreadsheets.google.com/spreadsheet/tq?range=A2:A17&key=0AhCv9Xu_eRnSdFNhSzNQUFd3b1ZfRHgtQURINFpzeGc&gid=9');
  query2.send(function (response) {
    if (response.isError()) {
        alert('Error in query2: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
    }
    // Get the data you want to pass to query3 here
    // var query3Data = ...
    queryValue3(query3Data);
  });
}

function queryValue3(passedData) {
  var query3 = new google.visualization.Query('https://spreadsheets.google.com/spreadsheet/tq?range=B2:B17&key=0AhCv9Xu_eRnSdFNhSzNQUFd3b1ZfRHgtQURINFpzeGc&gid=10');
  query3.send(function (response) {
    if (response.isError()) {
        alert('Error in query3: ' + response.getMessage() + ' ' + response.getDetailedMessage());
        return;
    }
    // Do something with passedData here
    // ...
  });
}

したがって、最初のクエリが返されるまで、2 番目のクエリを開始しないでください。

于 2013-03-05T15:00:58.893 に答える