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);
}
}
}
}