我通过API从两个不同的Google图书书架获取图书信息并尝试将其放入我的自定义HTML中,但并非一切都在显示,而且似乎是因为我的函数按顺序触发,即使我把它们按照我想要的顺序布置,一切都在$ ready内。我需要以某种方式使用回调吗?
这是我的小提琴:http://jsfiddle.net/bbrLv/
以下是控制台的一个镜头,显示了无序触发的步骤:http://min.us/mQ0LNVYYT
答案 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();
}