Javascript JSON解析函数返回undefined

时间:2016-03-14 01:16:07

标签: javascript json function callback return

我有一个功能 request.send(); ,可解析.json个文件,并按当前credits获取steamid

var request;
if (window.XMLHttpRequest) {
  request = new XMLHttpRequest();
} else {
  request = new ActiveXObject("Microsoft.XMLHTTP");
}

request.open('GET', './players.json');
request.onreadystatechange = function() {
  if ((request.readyState === 4) && (request.status === 200)) {
    var items = JSON.parse(request.responseText);
    for(var i = 0; i < items.length; i++)
    {
      if(items[i].steamid == currentSteamID)
      {
        playerCredits = parseFloat(items[i].credits);
        alert(playerCredits);
        return playerCredits;
      }
    }
  }
}

var playerCredits = request.send();
alert(playerCredits);

第一个提醒正常运行:

First Alert

我想稍后使用这些信用,这就是我将函数分配给变量的原因:

var playerCredits = request.send();

但警告playerCredits给我这个:

Second Alert

通过搜索类似的问题,我发现我需要使用 Callback ,我尝试这样做:

var request;
if (window.XMLHttpRequest) {
  request = new XMLHttpRequest();
} else {
  request = new ActiveXObject("Microsoft.XMLHTTP");
}
request.open('GET', './players.json');
request.onreadystatechange = function(callback) {
  if ((request.readyState===4) && (request.status===200)) {
    var items = JSON.parse(request.responseText);
    for(var i = 0; i < items.length; i++)
    {
      if(items[i].steamid == currentSteamID)
      {
        playerCredits = parseFloat(items[i].credits);
        callback(playerCredits);   
      }
   }
 }
}

request.send(function() {
   console.log(playerCredits);
});

然而,这是我得到的错误:

  

未捕获的TypeError:回调不是函数

我很确定我没有按照我应该使用 Callback ,现在我问你:

需要更改哪些内容才能发挥作用?

3 个答案:

答案 0 :(得分:0)

写作时

request.onreadystatechange = ...

= 之后的回调

这些偏见中的内容可能是一个事件对象 但是你会在request对象中找到所需的一切。所以你的回调函数不需要任何参数。

callback(playerCredits);没有任何意义。

我不确切地知道你想要做什么。回调是在某个事件发生后被回调的函数。

阅读本文

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

希望这有帮助

答案 1 :(得分:0)

将函数传递到.send函数 将其传递到onreadystatechange函数

您可以通过在callback之外声明onreadystatechange功能来利用闭包。

var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

// Declare the function here
function callback(playerCredits) {
    console.log(playerCredits);
    // Do other awesome stuff here
}

request.open('GET', './players.json');
request.onreadystatechange = function(callback) {
    if ((request.readyState === 4) && (request.status === 200)) {
        var items = JSON.parse(request.responseText);
        for(var i = 0; i < items.length; i++){
            if(items[i].steamid == currentSteamID) {
                var playerCredits = parseFloat(items[i].credits);

                // It is still in scope here.
                callback(playerCredits);   
            }
        }
    }
}

request.send();

备注:

  • 如果我是你,我会利用那些已经处理过所有这些的大量JavaScript库。如果我是你(我与jQuery没有任何关系),我会调查jQuery

    如果您使用jQuery,这就是您的代码:

    function callback(playerCredits) {
        console.log(playerCredits);
        // Do other awesome stuff here
    }
    
    $.ajax('./players.json', {
        complete: function(response) {
            var items = JSON.parse(request.responseText);
            for(var i = 0; i < items.length; i++){
                if(items[i].steamid == currentSteamID) {
                    var playerCredits = parseFloat(items[i].credits);
    
                    // It is still in scope here.
                    callback(playerCredits);   
                }
            }
        }
    }
    
  • 我使用console.log(playerCredits);代替alert(playerCredits),因为它更通用。如果你在大多数浏览器中console.log一个对象,你会看到对象的扩展(而不是[object Object]的{​​{1}}扩展。 (见How to open the JavaScript console in different browsers?

  • 我使用ternary operator重构了您的alert声明。

  • 我使用request关键字声明playerCredits,使其保持在var函数的函数范围内。在不使用onreadystate的情况下声明它使其成为自动全局变量。

进一步阅读:

答案 2 :(得分:0)

XMLHttpRequest.onreadystatechange是一个事件处理程序,换句话说,每次调用一个事件时调用的函数,在这种情况下 - 请求的状态已被更改。

引用此答案:What is a callback function?

  

回调函数是一个函数:

     
      
  • 作为参数传递给另一个函数,并且,
  •   某种事件后会调用
  •   

他们都实现了同样的目标,只是将它们传递给解释器的方式不同。

发送函数是一个void函数,这意味着它不返回任何值。因此,将send函数分配给变量意味着什么,如果您想使用响应,那么您必须将request.responseText分配给变量,但只有在我们得到响应之后,这意味着在事件处理程序中。

您可能需要查看此内容:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

但是你几乎不会使用原生的javascript来发送你的ajax请求, jQuery是一个帮助您轻松完成这些事情的库:http://api.jquery.com/jquery.ajax/