【问题标题】:sequencing jQuery functions with JSON使用 JSON 对 jQuery 函数进行排序
【发布时间】:2012-06-21 18:19:34
【问题描述】:

我通过 API 从两个不同的 Google 图书书架获取图书信息,并尝试将其放入我的自定义 HTML 中,但并非所有内容都显示,这似乎是因为我的函数按顺序触发,即使我让它们按照我想要的顺序排列,一切都在 $ready 中。我需要以某种方式使用回调吗?

这是我的小提琴:http://jsfiddle.net/bbrLv/

这是控制台的截图,显示了乱序触发的步骤:http://min.us/mQ0LNVYYT

【问题讨论】:

  • 不管具体问题,我想请教您代码中的其他一些内容:为什么在 getJSON 响应处理程序中使用 $(function() {..}) 构造?
  • 只是从某个地方,来自 YQL 或 Google Books API 的一个例子..

标签: jquery json callback


【解决方案1】:

$.getJSON()作为jQuery基于$.ajax的函数之一,实现了强大的Promise接口。这意味着您实际上可以通过以下方式使用$.then() 方法链接这些调用:

$.getJSON(myquery, function(data) {
  ... 
}).then(function() {
  $.getJSON(myquery2, function(data) {
     ...
  } 
});

更新:这是updated fiddle。我必须在那里快速破解:pubdateFixer 函数。您已将其放入第二个 getJSON 处理程序中的 $(function(){}) 表单中,但这是不正确的:该函数应在 getJSON 内容到达后立即触发,而不是在初始页面加载时触发。

【讨论】:

  • 这听起来更简单。与下面的替代方法相比有什么缺点吗?
  • 这更简单。我看到的唯一缺点是它的速度较慢,因为查询不会并行完成。根据您的问题,这可能有问题或没有问题(可能没有)。
  • jQuery 中的 promise 和 deferred 确实很强大。您还可以使用$.when 启动多个异步请求并指定在它们全部 完成时执行的回调。如果您需要从多个来源获取数据并在检索到所有数据后立即显示它们,这可能会很有帮助。
【解决方案2】:

您正在调用异步函数。

您根本无法预测来自服务器的响应以及您的回调将被调用的顺序(是的,您尚未使用回调,因为$.getJSON 将回调作为最后一个参数)。

因此,如果您需要确保响应处理的特定顺序,您需要使用 jquery then 函数(首先由 raina77ow 引用)来链接调用,或者添加另一个保护机制,例如布尔值每个响应和几行代码确保您按所需顺序执行操作。

例如:

function bigOperationNeedingBothAnswers() {
}

var answersStillNotArrived=2; 


$.getJSON(firstQuery, function (data) {
   // some things
   if (--answersStillNotArrived==0) bigOperationNeedingBothAnswers();
}
$.getJSON(otherQuery, function (data) {
   // some things
   if (--answersStillNotArrived==0) bigOperationNeedingBothAnswers();
}

【讨论】:

  • 好的,我不是一个编码员,我会喜欢一个布尔值的例子来响应..
猜你喜欢
  • 2014-09-27
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多