【问题标题】:setting jQuery .data() within .getJSON callback在 .getJSON 回调中设置 jQuery .data()
【发布时间】:2010-06-09 08:43:23
【问题描述】:

我正在执行几个 .getJSON 调用,如果其中任何一个调用成功,我会尝试将 bool 设置为 true,这样我就可以在页面的其他位置执行其他操作。我试图使用 jquery 的 .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'));

打印错误,即使我知道数据已通过。我认为这会起作用,因为 .data() 使用缓存来存储键/值对。我如何标记成功?感谢任何帮助!

【问题讨论】:

  • getJSON 是一个异步调用,你确定它在你调用console.log之前返回吗?

标签: jquery getjson


【解决方案1】:

您必须牢记代码实际运行的顺序。您的代码实际上将按以下顺序运行:

$('#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");

【讨论】:

  • 这很有帮助。那么还有其他方法可以实现我的目标吗?我可以以某种方式对所有 .getJSON 调用进行分组,然后在它们全部返回后运行一些代码吗?谢谢!
  • (在我的情况下,我至少需要一个响应,所以我会将计数器设置为 1,一旦它达到零,我就可以执行 gotResponses 函数)
  • 如果您只需要一个响应,则不需要计数器 - 只需从每个回调中调用相同的函数。
  • 但是如果他们都成功了,我会不必要地调用这个函数,对吧?
  • 这是一个公平的观点。是的,在这种情况下,计数器机制仍然有用。
【解决方案2】:

将您所描述的“在页面的其他位置做一些其他事情”放在一个函数中。在 $.getJSON() 回调中调用该函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2011-08-22
    • 1970-01-01
    • 2010-09-06
    • 2011-02-18
    • 2012-02-21
    • 2023-03-04
    • 2011-01-31
    相关资源
    最近更新 更多