我知道范围应该很简单。我可以看到,在查看范围界定的文档时,以及在阅读其他人的回复时,他们在这里问过这个问题。这就是为什么我很困惑。这是我正在使用的相关代码块:
$.ajax({
type: "GET",
url: locationURL,
success: function (result) {
console.log(result);
var output = "<table><thead><tr><th>ID</th><th>Subject</th></thead><tbody>";
for (var i in result.messages) {
var id = result.messages[i].id;
var locationURL = "https://www.googleapis.com/gmail/v1/users/me/messages/" + id + "?access_token=" + token;
var subject = "test";
$.ajax({
type: "GET",
url: locationURL,
success: function (result) {
subject = result.payload.headers[0].name;
console.log(subject);
}
});
console.log(subject);
output += "<tr><td>" + id + "</td><td>" + subject + "</td></tr>";
}
output += "</tbody></table>";
display.html(output);
$("table").addClass("table");
}
});
您可以说,我正在使用Gmail API。那我在这做什么?第一个ajax调用是获取所有消息ID的列表。然后,对于每个消息ID,我需要请求消息详细信息,因此嵌套的ajax调用。
现在,令人困惑的部分是:在外部ajax调用的成功函数中,我定义var subject = "test"
。我打算用每条消息的主题行覆盖它。在我专门在消息详细信息的有效负载中查找主题行之前,我只想获得一些新的字符串而不是测试。在嵌套ajax调用的success函数中,我设置了subject = result.payload.headers[0].name;
,随后的'console.log(subject)'显示var subject
有一个新值。但是,回到外部ajax,当我将下一个id
和subject
添加到我的表时,subject
的值仍会测试。
我很感激任何指示,谢谢!
答案 0 :(得分:0)
&#34; Ajax的&#34;代表&#34;异步JavaScript和XML&#34;,意味着它是异步。因此,无论何时调用$ .ajax,该代码都会在ajax调用之后立即与同时运行。这可能非常有用,但在像你这样的情况下也非常烦人,因为在ajax调用之外的东西取决于来自Ajax调用的数据。通常,这是成功函数的用途。
如果你想要一个快速而又脏的修复,你可以在你的ajax调用中添加async:false
作为键:值对,虽然这是非常不受欢迎的,因为它破坏了ajax的异步功能。
有关如何在for循环中进行异步ajax调用的信息,请参阅this answer。