4次查询后更新Dojo图表

时间:2012-12-09 09:55:03

标签: javascript dojo esri

我在Esri Javascript API内置了一张地图。

此地图中有一层,显示加油站。

随着地图范围的变化,我正在针对该层运行4个单独的查询,以查找当前范围内的总加油站数量,即每个加油站供应商的查询。

e.g。 (简化了一些)

//Shell 
shellQuery.where = "brand = 'Shell"
//Execute Query, and report result to console
shellQueryTask.executeForCount(shellQuery , function(count){
console.log(count);}

//BP
same again.  Repeats for 4 queries.

每个查询的结果都是dojo.deferred。

然而,由于它们是单独的查询(由于其他原因需要这种方式),它们都会在略有不同的时间返回结果。

最终目标 - 包括由这些查询更新的Dojo条形图,以根据供应商显示当前范围内加油站的细分。

对Javascript不熟悉,更不用说Dojo,我正在试着更新dojo图表的最佳方法。我看到的大多数Esri示例都是显示一个查询的结果,并且每次都创建一个新图表。

我正在寻找一种最优雅的方式来做到这一点。

我目前认为我需要将4个查询的结果写入全局数据数组,然后调用单独的函数来更新dojo图表。只是有点担心确保在所有四个查询都返回结果之前我不调用该函数。

1 个答案:

答案 0 :(得分:2)

Dojo的推迟和承诺对此非常有用!特别是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/