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 に答える