从匿名函数和onreadystatechange检索值
-
01-10-2019 - |
题
我有一个函数,只要单击一个按钮,就可以从中返回一个值作为一系列事件。但是,我不知道如何从onreadystatechange检索值。我该怎么做,以便我可以返回 vicArray[vicID]
?
function selectVictim()
{
var vicString;
var vicArray;
var vicID;
var params = "url=queenofsheep.com/Sheep/victims.php";
var request = new ajaxRequest();
request.open("POST", "victims.php", true);
request.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
request.setRequestHeader("Content-Length", params.length);
request.setRequestHeader("Connection", "close");
request.send(params);
request.onreadystatechange = function ()
{
if (this.readyState == 4)
{
if (this.status == 200)
{
if (this.responseText != null )
{
vicString = this.responseText;
vicArray = JSON.parse(vicString);
vicID = Math.floor(Math.random() * (vicArray.length - 1));
}
else alert("Ajax error: No data received");
}
else alert("Ajax Error: " + this.statusText);
}
}
alert(vicArray[vicID]);
}
解决方案
你不能。您的 onreadystatechange
处理程序被称为长 后 这 selectVictim
功能返回。
可以说,您所拥有的是“异步函数” - IE函数不会立即生成其返回值,而是在某些异步过程之后。
为了解决这个问题,必须使用回调来提供回报值:
function selectVictim( callback )
{
...
...
request.onreadystatechange = function() {
...
vicArray[vicID] = ...;
callback( vicArray[vicID] );
}
}
注意 callback
争论。谁称之为此功能,必须为此参数提供另一个函数。然后注意如何 selectVictim
返回值准备就绪时调用回调。
现在无论您在哪里打电话 selectVictim
, ,您必须从:
function someFunc()
{
doSomething();
var vic = selectVictim();
domeSomethingElseWithVictim( vic );
}
到:
function someFunc()
{
doSomething();
selectVictim( function( vic ) {
domeSomethingElseWithVictim( vic );
} );
}
足够简单吗?
其他提示
我将使用一个回调,您可以在该回复准备就绪后传递运行的功能。
添加 callback
作为参数:
function selectVictim(callback)
进而:
vicString = this.responseText;
vicArray = JSON.parse(vicString);
vicID = Math.floor(Math.random() * (vicArray.length - 1));
if (callback) {
callback(vicID);
}
当您调用功能时,您可以这样做:
selectVictim(function(vicID){
console.log('This is the id: ', vicID);
});
如果您不想直接执行功能,也可以将函数传递为值。注意:如果您提出大量请求并且需要保留它们的订单,但是有一些方法可以处理,这会变得有些棘手。
不隶属于 StackOverflow