2016-05-19 4 views
0

Я пытаюсь заполнить массив элементами JSON в ссылке на HighCharts.JQuery POST не заполняющий массив

Один из объектов JSON заполняется вручную, и нужно динамически заполнять сообщение PHP. Я пытаюсь использовать функцию обратного вызова для передачи данных в массив, но никакие данные, похоже, не будут нажаты.

Я могу проверить, что данные возвращаются из Почты PHP. Кажется, что он заполняет массив, но как только функция JQQ POST завершена, кажется, что массив опустел.

Кроме того, у меня есть консольный вызов внутри POST. Это действительно правильно печатает массив.

Вы можете увидеть из кода ниже, что я использую console.table() call сразу после публикации, и он пуст. Но после того, как я нажимаю вручную дальше, массив данных теперь имеет данные внутри него для ручного массива JSON.

Любые идеи?

Вот мой код:

/* INITIAL ARRAY **************************************/ 
data_array = []; 
var colors = Highcharts.getOptions().colors; 
categories = ['Dynamic', 'Manual']; 

/* FUNCTION TO PUSH TO ARRAY *****************************/ 
function push_toarray(cats,counts) { 

    data_array.push({ 
     y: 10.38, 
     color: colors[1], 
     drilldown: { 
      name: 'Dynamically Populated', 
      categories: [cats], 
      data: [counts], 
      color: colors[1] 
     } 
    });  
} 

/* PHP AND FOR LOOP FOR GETTING DATA *********************************************/ 


    $.post("php/dt_charts.php") 
     .done(function(data) { 
     var obj = jQuery.parseJSON(data); 

     // To verify the values are returned 
     console.log(obj.fe_det_name); 
     console.log(obj.fe_det_count); 

     push_toarray(obj.fe_det_name, obj.fe_det_count); 
     console.table(data_array); // This prints the array correctly with both JSON objects inside 
    }); 

    //console.table(data_array); // This prints no data. 

/* MANUAL DATA ARRAY *********************************************/ 


    data_array.push({ 
     y: 10.38, 
     color: colors[1], 
     drilldown: { 
      name: 'Manually Populated', 
      categories: ['Firefox v31', 'Firefox v32', 'Firefox v33', 'Firefox v35', 'Firefox v36', 'Firefox v37', 'Firefox v38'], 
      data: [0.33, 0.15, 0.22, 1.27, 2.76, 2.32, 2.31, 1.02], 
      color: colors[1] 
     } 
    }) 


console.table(data_array); // This prints only the manually populated array values 
+0

Таким образом, проблема заключается в том, что внутри «сделанной» функции объект заселен. Но когда вы покидаете функцию, все модификации исчезают и становятся пустыми? – user4035

+0

проблема в том, что javascript является асинхронным, поэтому, когда вы пытаетесь получить доступ к массиву после отправки сообщения, на самом деле происходит то, что пост выполняется после вашего оператора журнала, поэтому вы получаете пустое data_array – MoniXx

+0

, это решение написать свой код внутри сделанного обратного вызова, таким образом, вы можете фактически использовать значения, возвращенные из вашего сообщения. – MoniXx

ответ

3
$.post("php/dt_charts.php") 
    .done(function(data) { 
    var obj = jQuery.parseJSON(data); 

    // To verify the values are returned 
    console.log(obj.fe_det_name); 
    console.log(obj.fe_det_count); 

    push_toarray(obj.fe_det_name, obj.fe_det_count); 
    console.table(data_array); // This prints the array correctly with both JSON objects inside 

<----- move your logic here, 

}); 

Переместить вашу логику там, и если вы не можете, чем поместить вашу логику в функции и вызвать эту функцию внутри сделано обратного вызова.

+0

Спасибо Monix. Я только что пришел к тому же выводу после некоторого тестирования. Перемещение логики внутрь функции .done работает. – luskbo

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