установка jQuery .data () в обратном вызове .getJSON - PullRequest
1 голос
/ 09 июня 2010

Я делаю пару вызовов .getJSON, и если какой-либо из них завершается успешно, я пытаюсь установить для bool значение true, чтобы потом можно было делать другие вещи в другом месте на странице.Я пытался использовать функцию jdery .data (), но мне кажется, что я не могу установить ее внутри обратного вызова .getJSON.например:

$('#citations_button').data('citations', false);

$.getJSON(apaurl, function(data) {
    $('#apacite').html("<td class=\"bibInfoLabel\">APA Citation</td><td class=\"bibInfoData\">"+data+"</td>");
    $('#citations_button').data('citations', true);
}, "html");

// other .getJSONs look like above...

console.log("citations? "+$('#citations_button').data('citations'));

печатает false, даже когда я знаю, что данные были получены.Я думал, что это будет работать, так как .data () использует кэш для хранения пары ключ / значение.как я могу отметить успехи ??ценим любую помощь !!

Ответы [ 2 ]

3 голосов
/ 09 июня 2010

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

$('#citations_button').data('citations', false);
$.getJSON(apaurl, ..., "html");
console.log("citations? "+$('#citations_button').data('citations'));

Затем, в конце концов, когда асинхронный запрос вернется, он запустит вашу функцию обратного вызова:

$('#apacite').html("<td class=\"bibInfoLabel\">APA Citation</td><td class=\"bibInfoData\">"+data+"</td>");
$('#citations_button').data('citations', true);

Конечно, вы в конечном итоге установить citations равным true, но только после того, как вы уже напечатали его значение false на консоли.

Если вы хотите сделать что-то только послевы получили данные JSON, этот код абсолютно должен находиться в этой функции обратного вызова (или, конечно, должен вызываться из этой функции обратного вызова).

Если вам нужно дождатьсяВ результате всех вызовов вы можете сделать что-то вроде этого:

var expectedResponses = 2;

function gotResponsesFromAllCalls() {
    // Do things you can only do when ALL calls have returned.
};
$.getJSON(url1, function(data) {
    // Do things specific to the return of URL 1
    if (--expectedResponses == 0)
        gotResponsesFromAllCalls(); 
}, "html");

$.getJSON(url2, function(data) {
    // Do things specific to the return of URL 2
    if (--expectedResponses == 0)
        gotResponsesFromAllCalls(); 
}, "html");
0 голосов
/ 09 июня 2010

Поместите в функцию то, что вы описываете как «делайте другие вещи в другом месте на странице».Вызовите эту функцию в обратном вызове $ .getJSON ()

...