2013-03-06 2 views
1

я следующий метод в JavaScript:Работы со странным вопросом с предупреждением() в JavaScript,

function getData(){ 
    var result; 

    $.getJSON("app/data/ptl", function (data) { 
     if (data == null) { 
      return false; 
     } 

     var x_data = new Array(); 
     var y_data = new Array(); 

     $.each(data, function(index, value) { 
      x_data.push(index); 
      y_data.push(value); 
     }); 

     result = [months_data,value_data]; 

    }); 

    alert(''); 
    return result; 
} 

Когда этот метод вызывается, точные данные извлекаются. Однако, когда я удаляю alert(''), данные не принимаются. Кто-нибудь знает разумное объяснение этой проблемы?

+0

Я думаю, вам нужно показать нам что-то еще. Вот простая версия того, что вы делаете, что не работает с моим предупреждением или без него: http://jsfiddle.net/3yhqf/4/ Ответы на асинхронные результаты верны и должны исправить вашу проблему, но добавление предупреждение не позволит оператору return уловить обновление. –

ответ

4

Ваш alert() и return r; находятся за пределами «успеха» обработчик вашего АЯКС вызова. Помните, что вызовы AJAX являются асинхронными. Предупреждение заставляет браузер ждать, пока вы подтвердите предупреждение, которое позволяет (обычно) вызов AJAX завершить и заполнить ваш r vairable. Без предупреждения, .getJSON() немедленно возвращается, ДОПОЛНИТЕЛЬНО r.

+0

не должна ли исходная функция запускаться до завершения независимо от предупреждения? Я не уверен, почему предупреждение задерживает возвращение. Кажется, здесь нет: jsfiddle.net/3yhqf –

+0

no. отступы отключены. right ПЕРЕД линией alert() является '});' который закрывает обработчик успеха. если '});' ПОСЛЕ обратного вызова, то код будет более правильным. –

+0

Насколько я могу судить, он делает асинхронный запрос, вызывает предупреждение, а затем возвращается. Должна ли исходная функция работать до завершения, а затем выполнить обратный вызов? Вот как это работает на простом примере в скрипке. –

6

Это потому, что ваша функция асинхронна, и удаление alert делает линию return r до ответа удаленного сервера.

Вы не можете просто синхронно возвращаться от функции, вызывающей асинхронную работу. Обычное решение состоит в обеспечении обратного вызова и выполнить то, что вы хотите сделать в обратном вызове:

function fetchData(doWithData){ 
    $.getJSON("app/data/ptl", function (data) { 
    if (data == null) { 
     return; 
    } 
    var x_data = new Array(); 
    var y_data = new Array(); 
    $.each(data, function(index, value) { 
     x_data.push(index); 
     y_data.push(value); 
    }); 
    r = [months_data,value_data]; 
    doWithData(r); 
    }); 
} 


fetchData(function(result) { 
    // use result here 
}); 
+0

не должна ли функция запускаться до завершения независимо от предупреждения? Я не уверен, почему предупреждение задерживает возвращение. Кажется, здесь нет: http://jsfiddle.net/3yhqf/ –

+0

Предупреждение обрабатывается синхронно, оно останавливает код. –

+1

Mmhmm, но почему обратный вызов запускается до завершения функции getData? Должно ли getData запускаться до завершения вызова обратного вызова? –

1

$.getJSON() звонок устанавливает асинхронный процесс. Сама функция возвращается немедленно (почти), но функция обратного вызова, которую вы передаете, будет выполнена позже, когда браузер действительно получил ответ от сервера, с которым вы связываетесь. Таким образом, изначально не имеет смысла возвращать значение из такого обратного вызова, поскольку ничто не может или не обратит на него внимания.

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

+0

не должна ли исходная функция запускаться до завершения независимо от предупреждения? Я не уверен, почему предупреждение задерживает возврат. Кажется, здесь нет: jsfiddle.net/3yhqf –

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