1

我有一个函数,每当单击按钮时,我想从中返回一个值作为一系列事件。但是,我不知道如何从 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]);
}
4

2 回答 2

0

你不能。您的处理程序在函数返回onreadystatechange很长时间被调用。selectVictim

可以说,这里有“异步函数”——即不是立即生成返回值,而是在某个异步过程之后生成返回值的函数。

为了解决这个问题,必须使用回调来提供返回值:

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

    } );
}

够简单吗?

于 2010-08-26T21:12:12.697 回答
0

我会使用回调,您可以在其中传递响应准备就绪后运行的函数。

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

如果您不想直接执行此操作,也可以将函数作为值传递。注意:如果您发出大量请求并且需要保留它们的发出顺序,这会有点棘手,但有一些方法可以处理它。

于 2010-08-26T21:15:01.660 回答