получить доступ к строке json извне функции обратного вызова, которая ее читает - PullRequest
1 голос
/ 08 апреля 2011
var plane;

$.getJSON(sTailFileName, function(plane) {
    $('#upTailNum').html(plane.tailNum + '   ' + plane.airplaneType);
        document.title="Load " + plane.tailNum;
        ....  goes on for 300+ statements ....
});

и работает нормально.Тем не менее, я хочу сделать что-то вроде:

var plane;

$.getJSON(sTailFileName, function(plane) {});

$('#upTailNum').html(plane.tailNum + '   ' + plane.airplaneType);
document.title="Load " + plane.tailNum;

, но это дает мне сообщение «плоскость не определена».Мне нужно попасть в самолет за пределами сферы действия getJSON - или, по крайней мере, хочу.Я пробовал много вещей, включая $ .proxy и сквозные замыкания (которые я пока не совсем понимаю), но пока безуспешно.

Это моя первая попытка в Javascript / jQuery.Я пытаюсь заменить старую программу DOS, которую я написал в 1988 году. Подробнее см. http://terryliittschwager.com/WB/wbjs.html.

Любая помощь будет принята с благодарностью!

Терри Лииттшвагер

Ответы [ 4 ]

0 голосов
/ 08 апреля 2011

Вы привыкли к программированию синхронно.Вам нужно обернуть любую логику, которая использует объект plane в функции, и вызвать эту функцию из вашего обратного вызова getJSON.Примерно так:

$.getJSON(sTailFileName, function(plane) {
    // pass "plane" along to some other function that does the work
    doStuff(plane);
});

Причина, по которой вы посылаете function в качестве аргумента getJSON, заключается в том, что вы не знаете, когда будет получен ответ.

ХотяЯ родился в 1988 году, когда вы писали программы для DOS, поэтому, если вы хотите, чтобы я сорвался с вашего газона, я в порядке; -)

-tjw

0 голосов
/ 08 апреля 2011

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

Вы не должны пытаться обойти это.Функция обратного вызова является правильным местом для обработки ответа.

0 голосов
/ 08 апреля 2011

Ваша функция обратного вызова на getJSON получает значение plane, но ничего с ним не делает; поэтому, когда вы делаете plane.tailNum, plane все еще не определено, потому что ему никогда не присваивалось значение. Кроме того, getJSON вызов является асинхронным, поэтому вы не можете просто сделать это:

$.getJSON(sTailFileName, function(x) { plane = x; });

, поскольку plane = x не будет выполнен (если вам не очень повезет с временем), когда вы попытаетесь получить доступ к plane.tailNum.

Вы можете заменить вызов getJSON синхронным вызовом $.ajax и назначить BLOB-объект JSON на plane в обратном вызове success или продолжить работу первым способом. Вы всегда можете поместить свои «инструкции 300+» в отдельную именованную функцию, скажем, three_hundred_lines и ссылаться на нее по имени:

function three_hundred_lines(plane) { /* ... */ }
$.getJSON(sTailFileName, three_hundred_lines);

, если вы не хотите вставлять большую кучу кода.

0 голосов
/ 08 апреля 2011

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

$.getJSON(); просто запускает запрос и немедленно возвращается. Любой код, следующий за ним, будет выполнен до возврата данных json.

...