Dojo 的 deferreds 和 promises 非常适合这个!特别是dojo/promise/all模块(以前称为 DeferredList)。
既然你说你的executeForCount
函数返回 Deferreds,你可以这样做:
shellQueryDeferred = shellQueryTask.executeForCount(shellQuery);
texacoQueryDeferred = texacoQueryTask.executeForCount(texacoQuery);
....
// I assume you've required "dojo/promise/all" as "promiseAll" here:
promiseAll([shellQueryDeferred, texacoQueryDeferred, ...]).then(
function(results) {
// The "results" variable is an array with the results
// from each query, after they've all completed.
});
至于更新图表,我不完全确定最优雅的方式是什么。要记住的一件事是chart.addSeries("name", [1,2,4])
可以用相同的名称反复调用,并且该系列的数据将简单地更新。之后你必须打电话chart.render()
。
例如:
promiseAll([shellQueryDeferred, texacoQueryDeferred, ...]).then(
function(results) {
var chartNumbers = getNumbersForChartFromQueryResults(results);
chart.addSeries("Petrol stations", chartNumbers);
chart.render();
});
我总是在回答时摆弄,所以也许它有一些帮助: http: //fiddle.jshell.net/froden/SZmkJ/
编辑:Dojo 1.7 变体:
就像 Juffy 所说,在 1.7 中,您必须使用dojo/DeferredList。它几乎就像搜索和替换一样简单,但有一些陷阱。首先,它必须像一个类一样实例化:
//promiseAll([shellQuery, texacoQuery, bobsPetrolAndBurgersQuery])
// I assume you've required "dojo/DeferredList" as "DeferredList" here:
new DeferredList([shellQuery, texacoQuery, bobsPetrolAndBurgersQuery])
.then(function(data) {
....
其次,data
回调函数中的现在是一个数组数组,其中每个子数组中的第一项是成功/失败布尔值。因此,在将数据传递到图表之前,您可能需要稍微处理一下数据。(http://fiddle.jshell.net/froden/SZmkJ/1/)