2013-03-20 24 views
3

我有一個頁面,其中包含一些從Google電子表格生成的圖表。谷歌圖表API:爲現有回調添加參數

典型的代碼如下所示:

var url = "http://my.googlespreadsheet.com/tq?argumentshereblahblahblah"; 
// create and send off the query 
var query = new google.visualization.Query(url); 
query.send(handleQueryResponse); 

function handleQueryResponse(response) { 
    // omitted code to handle errors 
    // create new chart object, specify location in page 
    var chart = new google.visualization.BarChart(document.getElementById('chart-' + i)); 
    // draw chart 
    chart.draw(data, {}); 
} 

正如我在頁面上有幾個圖表,我想以編程方式創建它們,而不必有X函數看上去都一樣,只用圖表位置和標題不同。我建立了一系列電子表格參考,我遍歷它們,將每個參數傳遞給一個運行上述代碼的函數:創建一個查詢,發送它,處理響應。我想要做的是將一個額外的參數傳遞給handleQueryResponse回調函數,以便我可以指定圖形應該在頁面上的哪個位置。不過,我無法找到將我的變量存入handleQueryResponse的方法。如果我這樣做:

// array of spreadsheet refs 
var quArr = ['gid=2&range=D2%3AE10&headers=-1','gid=2&range=D15%3AE19&headers=-1', (etc.) ]; 
var base_url = "http://my.googlespreadsheet.com/tq?"; 
var i; // iterator 

// iterate through the spreadsheet refs and send off the queries for each 
for (i = 0; i < quArr.length; i++){ 
    var url = q_base + quArr[i]; 
    var query = new google.visualization.Query(url); 
    query.send(handleQueryResponse); 
} 

// deal with the responses 
function handleQueryResponse(response) { 
    // omitted code to handle errors 
    // get the data from the response 
    var data = response.getDataTable(); 
    // create new chart object, specify location in page 
    // anchors in the page correspond to where the chart should go 
    var chart = new google.visualization.BarChart(document.getElementById('chart-' + i)); 
    chart.draw(data, { extra args }); 
} 

...返回響應的異步性意味着迭代器與我發送請求時的值不同。從API docs

額外的信息:

發送(回調)

將查詢發送到數據源。 回調應該是一個在數據源響應時將被調用的函數。回調函數將接收一個類型爲google.visualization.QueryResponse的參數。 返回值:無

問題:

1)沒有什麼是寫在API文檔有關query.send(回調)基本上意味着我不能改變的回調採取額外的參數?

2)任何人都可以提出解決此問題的另一種方法?

回答

3

只是算出了我自己的問題的答案 - 嗚呼!應該堅持多一點。 ;)

如果它對其他人有用,我創建了一個新函數來執行查詢並使用閉包進行回調。這裏是重組代碼:

for (var i = 0; i < quArr.length; i++){ 
    var url = q_base + quArr[i]; 
    var query = new google.visualization.Query(url); 
    doQuery(query, i); 
} 

function doQuery(q, it){ 
    q.send(function(response){ 
     // omitted error handling code 
     var data = response.getDataTable(); 
     var chart = new google.visualization.BarChart(document.getElementById('chart-' + it)); 
     chart.draw(data, { other args }); 
    }); 
}