2015-11-12 3 views
-1

У меня есть файл PHP, возвращающий данные в формате требуемого массива в мой FlotChart, он работает. Теперь я пытаюсь получить этот результат в моем сценарии с помощью Ajax, но я не могу видеть результат на глобальном переменном, как описано ниже:Как вернуть данные в переменную после успеха ajax-звонка

myJS.js 
var EcomDashboard = function() { 
    return { 
     init: function() { 

     var dataEarnings = NULL; 

     $.ajax({ 
      url:"operation.php", 
      dataType: "text", 
      success:function(data) { 
       alert(data); //show my array [ [1, 20],[2,30],[3,14] ] 
       dataEarnings = data; 
      } 
     }); 

     alert(dataEarnings); //showing "NULL" but I need [ [1, 20],[2,30],[3,14] ] 

     ... 

Что такое правильный способ присвоить мои переменные Доходы даты массива [[1, 20], [2.30], [3.14]]?

+0

Вы не можете использовать Json вместо Ajax? я использую его почти так, как обычно, и он обычно работает. Поскольку Ajax является асинхронным, код достигает предупреждения в то же время (если не раньше) функции ajax, с Json, он «ждет» для завершения функции, а затем запускает остальные –

+0

@PauloLima [JSON] (http://json.org/): _ (Обозначение объекта JavaScript) - это легкий формат обмена данными. – Andreas

+0

FlotChart не является стандартным json-форматом, но я мог бы попробовать ... Как вы получаете результат с помощью JSON? – Thompsom

ответ

1
$.ajax({ 
    url:"operation.php", 
    dataType: "text", 
    success:function(data) {   
    doSomthingOnComplete(data); 
    } 
}); 

function doSomthingOnComplete(data) 
{ 
    // do here your work 
} 
+0

Да, но этот я очень стараюсь и работаю –

+0

Парень, он отлично работает! Мне не нужно создавать новый JS с этим решением ... tks! – Thompsom

2

Javascript - это асинхронный язык, это означает, что он не будет ждать завершения запроса http для выполнения следующей строки. вам придется назначить переменную внутри блока success. предупреждение показывает нуль, потому что он был выполнен до завершения строки запроса $ .ajax http.

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

dataAccess.js  
var ecomDashboard = function() { 

      init: function(callback) { 

      var dataEarnings = NULL; 

      $.ajax({ 
       url:"operation.php", 
       dataType: "text", 
       success:function(data) { 
        callback(data); 
       } 
      }); 
     } 
    } 

controller.js 
    ecomDashboard.init(function(data){ 
      // data contains the array result 
     // do your stuff 

    }) 

событие лучше: так JQuery 1.5 есть включен интерфейс обещание и .success собирается быть устаревшим. отредактированные: благодаря Kevin B

так с обещанием:

dataAccess.js  
    var ecomDashboard = function() { 

       init: function(callback) { 

       var dataEarnings = NULL; 

       return $.ajax({ 
        url:"operation.php", 
        dataType: "text" 
       }); 
      } 
     } 

    controller.js 
     ecomDashboard.init().done(function(data){ 
//do your stuff 
alert(data); 
}).fail(function(error){ 
//do stuff when error 
}); 
+0

Обратите внимание, что успех: не устарел, но .success есть. Очень важное различие. Нет ничего плохого в использовании 'success: function() {}', кроме того, что использование сигнатуры обещания обеспечивает больше функциональности, оно не устарело. –

+0

@kevinB спасибо, что указал, отредактировал – Kossel

0

Это происходит потому, что alert(dataEarnings) выполняется, прежде чем ваш запрос Ajax решает. Первая буква в аббревиатуре AJAX - Asynchronous. Таким образом, в конечном счете ваши данные устанавливаются правильно, вы просто пытаетесь получить к нему доступ до завершения асинхронного вызова.