javascript - 在顺序循环中修改多个 Highcharts

标签 javascript highcharts promise es6-promise

摘要

我目前工作的环境中,给定页面上有大约 14 个以上的股票图表(每个图表都有 20,0000 多个独特的数据点,有些甚至更多)。我有某些全局“切换”,例如,会影响显示哪个系列、图表选项或轴极值(在所有图表上)。鉴于用户一次只能看到一个图表,我想将图表的更新视为队列,首先更新一个图表,然后再更新第二个图表,依此类推。

我的目标:在循环中按顺序调用 Highcharts.Chart.redraw() (即,一次在页面中的每个图表上调用重绘 - 以便首先重绘图表列表中的第一个图表)。请注意,图表列表的顺序是动态创建的,并且已经处理好。

背景

到目前为止,我已经阅读了大量有关 JavaScript Promise 的文章,我过去曾用它来链接 ajax 调用。正如以下链接中所讨论的:

我还在这里阅读了一些与循环中的 Promise 相关的更一般性问题:

代码/详细信息

我尝试了多种解决方案,并且相信问题在于使 Highcharts 重绘函数 - 或调用它的操作(如 Chart.update()、Series.setVisible()、Axis.setExtremes()) - 返回一个 promise 。

我上传了一些 shell here它允许您触发一个事件,并看到每个图表基本上是立即更新的。


例如,如下所示:

$(Highcharts.charts).each(function(i, chart) {
    console.log(i);
    // decide what to do with the chart
    // update Series, Chart options, Axis extremes... etc.
    chart.redraw(); // call redraw at the end
})

将输出:

> 1, 2, 3, ..., n // pause, then charts would redraw()

值得一提的是,虽然上面的内容看起来响应迅速,但在我的环境中,单击切换与图表重绘事件完成之间可能存在 2-5 秒的延迟。

我不知道如何让循环等待每个图表完成重绘,然后再继续处理列表中的下一个图表。

如果您能提供任何帮助,我们将不胜感激。

最佳答案

如果我理解你的意思,你可以通过将触发器中的代码包装在 setTimeout 中(超时值为 0),然后包装在新的 Promise 中来实现它

使用 async/await 会是这样的

$('#trigger').click(async (e) => {
    for (let chart of Highcharts.charts) {
        await new Promise(resolve => setTimeout(() => {
            chart.series.forEach(series => series.setVisible(undefined, false));
            chart.redraw();
            resolve();
        }, 0));
    }
});

关于javascript - 在顺序循环中修改多个 Highcharts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387115/

相关文章:

node.js - Sequelize 将多个查询数据发送到页面

javascript - `useState` 函数内部 `useEffect` 函数的工作

javascript - PHP 中的无符号右移/零填充右移/>>>(等效于 Java/JavaScript)

javascript - Highcharts xrange 拒绝遵循 HOVER 或 SCROLLBAR 行为

javascript - 添加新点时移动图表

highcharts - 尝试在 HighStock 中的条形图上设置最小高度

javascript - 保证不适合我 http.get

javascript - 分页 API 过滤后的 axios 结果数组为空

php - 我的域名前缀搞乱了...我该如何解决这个问题?

javascript - 在源节点上调用 stop() 是否会触发结束事件?