Question

J'ai une fonction dont je voudrais revenir une valeur en tant que série d'événements chaque fois qu'un bouton est cliqué. Cependant, je ne peux pas comprendre comment récupérer la valeur de onreadystatechange. Comment puis-je faire pour que je puisse revenir 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]);
}
Était-ce utile?

La solution

Vous ne pouvez pas. Votre gestionnaire de onreadystatechange est appelé à long après le rendement de la fonction selectVictim.

Qu'est-ce que vous avez ici est, pour ainsi dire, « fonctions asynchrones » - à savoir les fonctions qui génèrent leur valeur de retour ne sont pas immédiatement, mais après un certain processus asynchrone

.

Pour faire face à cela, on doit utiliser un rappel pour fournir une valeur de retour:

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

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

Notez l'argument callback. Celui qui appelle cette fonction, doit fournir une autre fonction de cet argument. Notez ensuite comment selectVictim appelle le rappel lorsque la valeur de retour est prêt.

où que vous appelez selectVictim, vous devez modifier votre code de:

function someFunc()
{
    doSomething();

    var vic = selectVictim();

    domeSomethingElseWithVictim( vic );
}

Pour:

function someFunc()
{
    doSomething();

    selectVictim( function( vic ) {

        domeSomethingElseWithVictim( vic );

    } );
}

Assez simple?

Autres conseils

J'utiliser un rappel, dans lequel vous pouvez passer la fonction qui exécute une fois la réponse est prêt.

Ajouter callback comme param:

function selectVictim(callback)

et

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

Lorsque vous appelez la fonction que vous pouvez faire ceci:

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

Vous pouvez également passer la fonction en tant que valeur si vous préférez ne pas le faire directement. Note:. Il est un peu délicat si vous faites une tonne de demandes et vous avez besoin de préserver l'ordre dans lequel elles ont été faites, mais il y a des façons de gérer que

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top