我有一个功能 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);
第一个提醒正常运行:
我想稍后使用这些信用,这就是我将函数分配给变量的原因:
var playerCredits = request.send();
但警告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);
});
然而,这是我得到的错误:
未捕获的TypeError:回调不是函数
我很确定我没有按照我应该使用 Callback ,现在我问你:
需要更改哪些内容才能发挥作用?
答案 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/。