0

我有一个定义变量的函数,我想在下一个函数中使用该值。每个函数都有自己的查询。我想我要么需要将查询组合成一个函数,我不知道该怎么做,要么使用第一个查询设置一个全局变量,以便可以在第二个函数中引用它。

我一直在阅读全局变量,他们说这不是一个好习惯。有人可以帮助我如何将变量从一个函数重用到下一个函数,或者将两个查询结合起来,否则我应该考虑另一种 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

实际上,您进行了两个本质上并行的异步网络调用(Query.send()调用)。不知道哪个会先返回(或者一个是否会失败),因此无论您使用全局变量还是其他东西,依赖另一个回调的数据都是不可靠的并且是个坏主意。

我认为您可能只想链接两个异步调用,因此请尝试以下形式:

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
    // ...
  });
}

所以在第一个查询返回之前不要开始第二个查询。

于 2013-03-05T15:00:58.893 回答