0

我正在设置 Google+ 登录,并尝试将电子邮件设置为实际获取电子邮件的函数之外的变量,以便以后可以使用它来创建帐户。但是我在 Javascript 中遇到了范围问题。当我运行此代码时(请注意,这只是代码的一部分),我得到的第一个警报框显示“2:asdf”,第二个警报框显示“1:[在此处插入电子邮件]”。我期望得到的是 alert("2: " + email); 有电子邮件,而不是 asdf,但它没有这样做。有任何想法吗?

    var email = "asdf";
    // Get the email
    gapi.client.load('oauth2', 'v2', function()
    {
        gapi.client.oauth2.userinfo.get().execute(function(resp) {
            email = resp.email;
            alert("1: " + email);
        });
    });

    alert("2: " + email);
4

1 回答 1

0

这不是范围问题,这是时间问题。

execute方法是异步的,因此您给它的回调函数不会立即执行。它将挂在函数上,并在答案到达后调用它。

调用之后的代码将在答案到达之前继续执行,因此第二个警报将在email变量更改之前运行。然后您的代码块结束并将控制权返回给浏览器。在您将控件返回给浏览器之前,它无法处理答案到达时触发的事件,这意味着第一个警报永远不会在第二个警报之前出现。

如果要使用答案中的值,则必须在回调函数中进行。由于该execute方法是异步的,因此您还必须编写代码来异步处理答案。

于 2013-11-10T00:12:43.433 回答