Javascript范围问题和混乱

时间:2018-03-07 06:44:24

标签: javascript jquery ajax gmail-api

我知道范围应该很简单。我可以看到,在查看范围界定的文档时,以及在阅读其他人的回复时,他们在这里问过这个问题。这就是为什么我很困惑。这是我正在使用的相关代码块:

$.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,当我将下一个idsubject添加到我的表时,subject的值仍会测试。

我很感激任何指示,谢谢!

1 个答案:

答案 0 :(得分:0)

&#34; Ajax的&#34;代表&#34;异步JavaScript和XML&#34;,意味着它是异步。因此,无论何时调用$ .ajax,该代码都会在ajax调用之后立即与同时运行。这可能非常有用,但在像你这样的情况下也非常烦人,因为在ajax调用之外的东西取决于来自Ajax调用的数据。通常,这是成功函数的用途。

如果你想要一个快速而又脏的修复,你可以在你的ajax调用中添加async:false作为键:值对,虽然这是非常不受欢迎的,因为它破坏了ajax的异步功能。

有关如何在for循环中进行异步ajax调用的信息,请参阅this answer