Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON解析函数返回未定义的_Javascript_Json_Function_Callback_Return - Fatal编程技术网

Javascript JSON解析函数返回未定义的

Javascript JSON解析函数返回未定义的,javascript,json,function,callback,return,Javascript,Json,Function,Callback,Return,我有一个功能请求。send()解析.json文件,并通过当前streamid var request; if (window.XMLHttpRequest) { request = new XMLHttpRequest(); } else { request = new ActiveXObject("Microsoft.XMLHTTP"); } request.open('GET', './players.json'); request.onreadystatechange = fun

我有一个功能
请求。send()
解析
.json
文件,并通过当前
streamid

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);
但是提醒玩家信用卡给我:


通过搜索类似的问题,我发现我需要使用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);
});
var请求;
if(window.XMLHttpRequest){
请求=新的XMLHttpRequest();
}否则{
请求=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
open('GET','./players.json');
request.onreadystatechange=函数(回调){
if((request.readyState==4)和&(request.status==200)){
var items=JSON.parse(request.responseText);
对于(变量i=0;i
然而,这是我得到的错误:

未捕获类型错误:回调不是函数

我很确定我没有像我应该的那样使用回调,现在我问你:

需要更改什么才能使其工作?当您编写

request.onreadystatechange = ...
=
之后出现的是回调

这些妄想症中出现的可能是一个事件对象 但您将在
请求中找到所需的所有内容。因此,回调函数不需要任何参数

具有
回调(playerCredits)没有任何意义

我不知道你到底想做什么。回调是在特定事件发生后回调的函数

读这个


希望这有助于将函数传递到
中。send
函数不会将其传递到
onreadystatechange
函数中

您可以通过在
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();
var请求=window.XMLHttpRequest?新的XMLHttpRequest():新的ActiveXObject(“Microsoft.XMLHTTP”);
//在这里声明函数
函数回调(playerCredits){
控制台日志(playerCredits);
//在这里做其他很棒的事情
}
open('GET','./players.json');
request.onreadystatechange=函数(回调){
if((request.readyState==4)和&(request.status==200)){
var items=JSON.parse(request.responseText);
对于(变量i=0;i

注意事项:

  • 如果我是你,我会利用大量的JavaScript库,这些库已经处理了所有这些问题。如果我是你,我会调查的(我与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);   
                }
            }
        }
    }
    
    函数回调(playerCredits){
    控制台日志(playerCredits);
    //在这里做其他很棒的事情
    }
    $.ajax(“./players.json”{
    完成:功能(响应){
    var items=JSON.parse(request.responseText);
    对于(变量i=0;i
  • 我使用了
    console.log(playerCredits);
    而不是
    alert(playerCredits)
    ,因为它更通用。如果在大多数浏览器中使用
    console.log
    对象,您将看到对象的扩展(而不是
    警报中的
    [object object]
    。(请参阅)

  • 我用一个函数重构了您的
    请求
    声明

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


进一步阅读:


XMLHttpRequest.onreadystatechange是一个事件处理程序,换句话说,每次调用事件时都会调用该函数,在本例中,请求的状态已更改

引用这个答案:

回调函数是一个函数,它是:

  • 作为参数传递给另一个函数
  • 在某种事件之后调用
它们都实现了相同的目标,只是传递给解释器的方式不同而已

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

您可能需要查看以下内容:

但您几乎永远不会使用本机javascript发送ajax请求,
jQuery是一个可以帮助您轻松完成这类工作的库:。

您的代码中有许多不一致之处,您似乎对JavaScript不太熟悉。我建议您查找回调、XHR等重要关键字的确切含义。Wikipedia是一个很好的地方。我可能会回答,但您会再来多少次?
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);   
            }
        }
    }
}