使用JSON对jQuery函数进行排序

时间:2012-06-21 18:19:35

标签: jquery json callback

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

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

以下是控制台的一个镜头,显示了无序触发的步骤:http://min.us/mQ0LNVYYT

2 个答案:

答案 0 :(得分:4)

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

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

更新:这是updated fiddle。我必须快速入侵:pubdateFixer函数。你已经在第二个getJSON处理程序中将它放入$(function(){})形式,但这不正确:函数应该在getJSON内容到达后完全触发,而不是在初始页面加载时。

答案 1 :(得分:3)

您正在调用异步函数。

您根本无法预测响应来自服务器的顺序,并且系统会调用您的回调(是的,您还在使用回调,因为$.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();
}