1

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

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

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

4

2 回答 2

4

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

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

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

于 2012-06-21T18:28:24.953 回答
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();
}
于 2012-06-21T18:22:49.980 回答