【问题标题】:OnReadyStateChange Scoping IssueOnReadyStateChange 范围问题
【发布时间】:2016-08-04 23:06:29
【问题描述】:

我正在尝试将New_Token 函数中的GetURL 的值从函数中取出,以便我可以使用它。我认为我的问题是request.onreadystatechange 行(虽然我不能确定)。 GetURL 在函数外部未定义。

var GetURL;
var request = new XMLHttpRequest();
var path="https://ops.epo.org/3.1/auth/accesstoken";

request.onreadystatechange= function() {New_Token(GetURL);};

var encodedData = window.btoa("key:secret"); //encode consumer key and secret key
request.open("POST", path, true);
request.setRequestHeader("Authorization", encodedData);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send('grant_type=client_credentials'); //send request to server, must include grant_type in payload or it won't work
alert(GetURL);

function New_Token(GetURL) {
    if (request.readyState == "4") //Request finished and response is ready
    {
        if (request.status == "200") {
            console.log(request.responseText);
            var TheResponse = JSON.parse(request.responseText);
            console.log(TheResponse);
            var TokenValue = TheResponse.access_token;
            console.log(TokenValue);
            GetURL = ("?access_token=" + TokenValue);
            console.log(GetURL); //this is the added string that needs to be concact. on to ALL OPS calls

            return(GetURL);
        }
        else {
             alert("Problem retrieving data");
            console.log(request.responseText);
        }
    }
}

【问题讨论】:

  • 目前发生了什么?
  • GetURL 的警报未定义。
  • 您的问题出在程序流程上。 request.send(...) 启动一个后台线程,该线程在您的alert(...) 代码之后 终止。您应该将alert(GetURL) 放在服务器回答您的request.send() 时执行的方法中@

标签: javascript ajax api xmlhttprequest onreadystatechange


【解决方案1】:

试试这个

function New_Token(GetURL) {
    if (request.readyState == 4 || request.readyState == "complete") 
    {
        if (request.status == 200||request.status == 0) {
            console.log(request.responseText);
            var TheResponse = JSON.parse(request.responseText);
            console.log(TheResponse);
            var TokenValue = TheResponse.access_token;
            console.log(TokenValue);
            GetURL = ("?access_token=" + TokenValue);
            console.log(GetURL); //this is the added string that needs to be concact. on to ALL OPS calls
            return(GetURL);
        }
        else {
             alert("Problem retrieving data");
            console.log(request.responseText);
        }
    }
}

【讨论】:

  • 旧代码在 New_Token 函数中获取正确的“GetURL”值。我想弄清楚的是如何使 GetURL 成为全局的(或者至少被返回,以便我可以在函数之外访问它)。如果我遗漏了什么,我深表歉意,但我不相信你的代码能解决这个问题。
  • 对于您的问题的误解,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2020-03-04
  • 2010-11-09
  • 2011-01-08
  • 2011-04-09
  • 2017-01-05
相关资源
最近更新 更多