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 がハングアップします。そのため、前のチャートのコールバックでチャートを 1 つずつ呼び出したいと考えています。(1枚描き終わったら、2枚目を描いて…)

これは、各チャートの名前を持つ配列を作成することで実現できます。関数callbackでは、インデックスをインクリメントして次のチャートを呼び出します。

ここで質問です。

チャート名のリストを手動で作成せずにすべてのチャートを描画するにはどうすればよいですか?

4

2 に答える 2

2

オブジェクト内のすべてのキーの反復可能な配列を作成し、各チャートの作成が完了すると、それらを1つずつ循環させることができます。

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();
}

ループなしでオブジェクトから一度に1つずつキーのリストを直接反復することはできないためfor (x in y)、インデックスをインクリメントすることで反復できる中間配列を作成する必要があります。

于 2012-06-09T07:27:57.430 に答える
0

JSDeferred ライブラリを探しています - http://cho45.stfuawsc.com/jsdeferred/

于 2012-06-09T07:14:04.527 に答える