首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在4次查询后更新Dojo图表

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

Stack Overflow用户
提问于 2012-12-09 17:55:03
回答 1查看 543关注 0票数 2

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

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

随着地图范围的变化,我对这个图层运行了4个独立的查询,以了解当前范围内的加油站总数,每个加油站供应商都有一个查询。

例如(某种简化)

代码语言:javascript
运行
复制
//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图表。只是有点担心确保在所有四个查询都返回结果之前不调用函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-09 22:14:34

Dojo的延期和承诺对此很有帮助!特别是dojo/promise/all模块(以前称为DeferredList)。

既然你说你的executeForCount函数返回了Deferreds,你可以这样做:

代码语言:javascript
运行
复制
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()打电话。

举个例子:

代码语言:javascript
运行
复制
promiseAll([shellQueryDeferred, texacoQueryDeferred, ...]).then(
    function(results) {
        var chartNumbers = getNumbersForChartFromQueryResults(results);
        chart.addSeries("Petrol stations", chartNumbers);
        chart.render();
    });

我总是在回答问题的时候胡乱摆弄,所以这可能会有所帮助:http://fiddle.jshell.net/froden/SZmkJ/

编辑:Dojo1.7变体:

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

代码语言:javascript
运行
复制
//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/ )

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13786412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档