2

我有一个对象charts

 var charts = {
        chart1 : function (){
            return {
                key1 : value1,
                key2: value2,
                key3, value3
            }
        },
        chart2 : function(){
            return {
                key1 : value1,
                key2: value2,
                key3, value3
            }
        },
        chart3 : function(){
            return {
                key1 : value1,
                key2: value2,
                key3, value3
            }
        } 
    }

一个函数callback

function callback(instance){
    .....
    .....
}

我可以chart1像这样画图表,

var chart = new Highcharts.Chart(charts.chart1(),callback);
// callback is a function which gets called when drawing of chart is completed.

所有像这样的图表,

 for(chart in charts){
        if(charts.hasOwnProperty(chart)){
            new Highcharts.Chart(charts.chart(),callback);
        }
    }

但是,同时绘制很多图表会挂起firefox。所以,我想在前一个图表的回调中一一调用图表。(画完一张,再画第二张,以此类推……)

我可以通过创建一个包含每个图表名称的数组来实现这一点。在callback函数上,我将增加索引并调用下一个图表。

问题来了,

如何在不手动创建图表名称列表的情况下绘制所有图表?

4

2 回答 2

2

您可以创建对象中所有键的可迭代数组,然后在构建每个图表时逐个循环遍历它们:

function makeAllCharts() {
    // make list of charts
    var chartList = [], pos = 0;
    for (chart in charts) {
        chartList.push(chart);
    }

    function nextChart() {
        if (pos < chartList.length) {
            var key = chartList[pos++];
            new Highcharts.Chart(charts[key](), function() {
                callback();
                nextChart();
            });
        }
    } 
    nextChart();
}

因为您不能在没有循环的情况下一次直接从对象中迭代一个键列表for (x in y),所以您确实需要创建可以通过增加索引来迭代的中间数组。

于 2012-06-09T07:27:57.430 回答
0

您正在寻找 JSDeferred 库 - http://cho45.stfuawsc.com/jsdeferred/

于 2012-06-09T07:14:04.527 回答