2012-06-09 4 views
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 я буду увеличивать индекс и вызывать следующий график.

Вот вопрос,

Как я могу нарисовать все графики без ручного создания списка имен диаграмм?

ответ

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), вам нужно создать промежуточный массив, который можно итерировать, увеличивая индекс.

+0

Да, это в значительной степени то, о чем я думал. Хотя вы удалили необходимость вручную создать список (массив). Я думал, что это может быть достигнуто без создания массива. – Jashwant

+1

Вам нужно создать структуру данных другого типа, которая позволяет получать следующее значение в структуре данных каждый раз, когда диаграмма завершается. Массив является самой простой такой структурой данных. Объект не имеет последовательного доступа, поэтому вы не можете напрямую использовать объект. Его можно выполнять только с помощью 'for (x in y)', и это не будет работать для этого типа проблемы. Массив - это самый простой способ. – jfriend00

+0

Кроме того, есть ли какая-то причина, что ваша структура данных «диаграмм» имеет в ней функции, а не только объекты в ней? В этом отношении, почему это не просто массив объектов, которые вы могли бы перенести в первую очередь. – jfriend00

Смежные вопросы