質問

ボタンがクリックされるたびに、一連のイベントとして値を返したい関数があります。ただし、OnreadedStateChangeから値を取得する方法を理解することはできません。どうすれば戻すことができますか 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 関数の戻り。

あなたがここに持っているのは、「非同期関数」と言うことです。つまり、すぐにではなく、特定の非同期プロセスの後に戻る値を生成する関数です。

これに対処するには、コールバックを使用して返品値を提供する必要があります。

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

直接実行したくない場合は、値として関数を渡すこともできます。注:大量のリクエストを行い、それらが作成された順序を保持する必要がある場合、少し注意が必要ですが、それを処理する方法があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top