2011-08-26 6 views
2

J'ai construit la fonction pour retourner une variable. Mais ma fonction utilise une autre fonction de manière asynchrone.portée variable dans la fonction asynchrone

function getVariable() { 
    var myVariable; 
    asyncronousFunction(function(...){ 

    myVariable = ... 

    }); 
    return myVariable; 
} 

Le problème est que myVariable à l'extérieur et à l'intérieur de asyncronousFunction sont des variables différentes. Donc, je ne peux pas attribuer de valeur à myVariable de la fonction asynchrone.

Comment résoudre ce problème d'étendue? Merci.

Répondre

5

Ils sont la même variable, mais vous ne pouvez pas return le résultat d'un appel de fonction asynchrone synchrone à partir de votre fonction getVariable. La valeur de myVariable sera mise à jour de manière asynchrone à un moment ultérieur non spécifié. Mais votre fonction renvoie la valeur maintenant. Ça ne marche pas. Cela signifie que votre fonction getVariable est également asynchrone, ce qui signifie que vous devez le concevoir de cette manière. Par exemple, il pourrait accepter un rappel, tout comme le fait asyncronousFunction.

4

Ils sont pas différentes variables, il est la même variable ... mais vous n'avez pas attribué une valeur à myVariable avant return à la fin de la fonction.

Le modèle correct ici serait pour getVariable et asychronousFunction pour accepter les rappels, qui sont exécutés lorsque le asynchronousFunction a terminé l'exécution.

function getVariable(callback) { 
    var myVariable; 
    asyncronousFunction(function(/* pass callback as one of the parameters */){ 

    myVariable = ... 

    }); 

    // Don't return myVariable, as it's useless at this point 
}; 

function asyncronousFunction(callback) { 
    // This simulates the asynchronous call. When the call finishes, invoke callback and pass the result as a parameter. 
    setTimeout(function() { 
     callback("result"); 
    }, 1000); 
} 

Vous devez alors modifier la façon dont vous utilisez la fonction getVariable().

Alors, où vous auriez pu avoir:

var value = getVariable(); 
// do whatever with value 
value++; 

Vous devriez maintenant:

getVariable(function (value) { // value is now passed as a parameter 
    value++; 
});