Frage

habe ich eine Funktion, aus dem Ich mag würde einen Wert als eine Reihe von Ereignissen zurückzukehren, wenn eine Schaltfläche geklickt wird. Aber ich kann nicht herausfinden, wie der Wert von onreadystatechange abzurufen. Wie kann ich es so machen, ich kann vicArray[vicID] zurückkehren?

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]);
}
War es hilfreich?

Lösung

Sie können nicht. Ihr onreadystatechange Handler wird lange namens nach die selectVictim Funktion zurückkehrt.

Was Sie hier haben, ist, so zu sagen: „asynchrone Funktionen“ - das heißt Funktionen, die ihre Rückgabewert erzeugen nicht sofort, sondern nach einer bestimmten asynchronen Prozess

.

damit umgehen, hat man einen Rückruf verwenden Rückgabewert zu bieten:

function selectVictim( callback )
{
    ...
    ...

    request.onreadystatechange = function() {
        ...
        vicArray[vicID] = ...;
        callback( vicArray[vicID] );
    }
}

Beachten Sie die callback Argument. Wer ruft diese Funktion muss eine andere Funktion für dieses Argument liefern. Dann beachten Sie, wie selectVictim den Rückruf aufruft, wenn der Rückgabewert bereit.

Jetzt, wo Sie selectVictim aufrufen, müssen Sie Ihren Code ändern aus:

function someFunc()
{
    doSomething();

    var vic = selectVictim();

    domeSomethingElseWithVictim( vic );
}

An:

function someFunc()
{
    doSomething();

    selectVictim( function( vic ) {

        domeSomethingElseWithVictim( vic );

    } );
}

Einfach genug?

Andere Tipps

Ich möchte einen Rückruf verwenden, in dem Sie die Funktion übergeben können, dass läuft, sobald die Antwort bereit ist.

In callback als param:

function selectVictim(callback)

und dann:

vicString = this.responseText;
vicArray = JSON.parse(vicString);
vicID = Math.floor(Math.random() * (vicArray.length - 1));
if (callback) {
 callback(vicID);
}

Wenn Sie die Funktion aufrufen Sie können dies tun:

selectVictim(function(vicID){ 
  console.log('This is the id: ', vicID); 
});

Sie können auch die Funktion als Wert übergeben, wenn Sie es vorziehen, sie nicht direkt zu tun. . Hinweis: es wird ein wenig schwierig, wenn Sie eine Menge Anfragen machen, und Sie müssen den Auftrag erhalten, in dem sie gemacht wurden, aber es gibt Möglichkeiten, das umgehen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top