Javascript 在4次查询后更新Dojo图表

Javascript 在4次查询后更新Dojo图表,javascript,dojo,esri,Javascript,Dojo,Esri,我有一张地图建在墙上 这张地图有一层,显示加油站 随着地图范围的变化,我将对该图层运行4个单独的查询,以了解当前范围内的总加油站数,即每个加油站供应商的查询 e、 g.(简化的部分) 每个查询的结果都是dojo.deferred 但是,由于它们是单独的查询(出于其他原因需要采用这种方式),它们都会在稍微不同的时间返回结果 最终目标-包括一个Dojo条形图,该条形图通过这些查询进行更新,以显示基于供应商的当前范围内的加油站明细 由于不熟悉Javascript,更不用说Dojo了,我正在琢磨更新Do

我有一张地图建在墙上

这张地图有一层,显示加油站

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

e、 g.(简化的部分)

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

但是,由于它们是单独的查询(出于其他原因需要采用这种方式),它们都会在稍微不同的时间返回结果

最终目标-包括一个Dojo条形图,该条形图通过这些查询进行更新,以显示基于供应商的当前范围内的加油站明细

由于不熟悉Javascript,更不用说Dojo了,我正在琢磨更新Dojo图表的最佳方法。我看到的大多数Esri示例都显示一个查询的结果,每次都通过创建一个新图表来实现

我正在寻找一个答案,这是最优雅的方式做到这一点


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

Dojo的尊重和承诺非常好!特别是模块(以前是DelferredList)

既然您说您的
executeForCount
函数返回延迟,您可以这样做:

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();
    });
在回答问题时,我总是在胡闹,所以也许这会有所帮助:

编辑:Dojo 1.7变体:

就像Juffy说的,在1.7中,你必须使用。这几乎和搜索和替换一样简单,但也有一些问题。首先,它必须像类一样实例化:

//promiseAll([shellQuery, texacoQuery, bobsPetrolAndBurgersQuery])
// I assume you've required "dojo/DeferredList" as "DeferredList" here:
new DeferredList([shellQuery, texacoQuery, bobsPetrolAndBurgersQuery])
    .then(function(data) { 
        ....

其次,回调函数中的
data
现在是一个数组数组,其中每个子数组中的第一项是成功/失败布尔值。因此,在将数据传递到图表之前,您可能需要对数据进行一些处理。()

不幸的是,ESRI API(包括Dojo)只包括1.7(抱歉,直到您发布您的答案才意识到)。将调查是否尝试将1.8也包括在混合中,但不确定是否在带有两个Dojo库的imapct加载时上。1.7中是否有任何等效功能?Dojo DeferredList功能(promise/all替换)在1.7中出现:
//promiseAll([shellQuery, texacoQuery, bobsPetrolAndBurgersQuery])
// I assume you've required "dojo/DeferredList" as "DeferredList" here:
new DeferredList([shellQuery, texacoQuery, bobsPetrolAndBurgersQuery])
    .then(function(data) { 
        ....