web-dev-qa-db-fra.com

Attendez la fin de la tâche async

J'interagis avec une bibliothèque JavaScript tierce dans laquelle certains appels de fonction sont asynchrones. Au lieu d'utiliser la logique asynchrone dans mon application, j'ai préféré écrire des wrappers synchrones pour ces appels asynchrones. Je sais, je sais, c'est un design épouvantable, mais il s'agit d'un projet de démonstration avec de très grandes chances d'être entièrement réécrit. J'ai besoin de quelque chose pour montrer le concept à l'équipe, sans avoir à me soucier de la performance pour l'instant.

Voici ce que je veux faire:

function sync_call(input) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) {value = result;} );

    return value;
}

J'ai essayé le jQuery différé et promis mais il semble viser le modèle de conception asynchrone. Je veux utiliser le modèle synchrone dans mon code.

32
Code Different

Ceci ne fonctionnera jamais, car le serveur JS VM est passé de cet appel async et a renvoyé la valeur que vous n'avez pas encore définie.

N'essayez pas de combattre ce qui est naturel et inhérent au comportement du langage. Vous devez utiliser une technique de rappel ou une promesse.

function f(input, callback) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) { callback(result) };

}

L'autre option est d'utiliser une promesse, regardez Q . De cette façon, vous retournez une promesse, puis vous y attachez un auditeur, ce qui revient en gros à un rappel. Lorsque la promesse se résoudra, alors se déclenchera.

29
bitoiu

Pourquoi ne pas appeler une fonction depuis votre rappel au lieu de renvoyer une valeur dans sync_call ()?

function sync_call(input) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) {
        value = result;
        use_value(value);
    } );
}
0
jbiz