2010-06-29 5 views
2

Je suis assez nouveau pour le style de callback de la programmation en javascript. Existe-t-il un moyen pour de forcer le code à attendre la fin d'un appel de fonction via un rappel? Laissez-moi vous expliquer. La fonction suivante prend un nombre et renvoie un résultat en fonction de celui-ci.Pause jusqu'à l'appel d'un rappel, en Javascript

function get_expensive_thing(n) { 
    return fetch_from_disk(n); 
} 

Jusqu'ici, assez facile. Mais que dois-je faire lorsque fetch_from_disk renvoie son résultat via un rappel? comme ceci:

function get_expensive_thing(n) { 
    fetch_from_disk(n, function(answer) { 
    return answer; // Does not work 
    }); 
} 

La précède ne fonctionne pas parce que le return est dans le cadre de la fonction anonyme, plutôt que la fonction get_expensive_thing.

Il existe deux "solutions" possibles, mais les deux sont inadéquates. On est à factoriser get_expensive_thing de se répondre à un rappel:

function get_expensive_thing(n, callback) { 
    fetch_from_disk(n, function(answer) { 
    callback(answer); 
    }); 
} 

L'autre est recoder fetch_from_disk, mais ce n'est pas une option.

Comment pouvons-nous obtenir le résultat souhaité tout en gardant le comportement souhaité de get_expensive_thing - à savoir, attendez que fetch_from_disk appelle le rappel, puis renvoyer cette réponse?

Répondre

2

Il n'y a pratiquement pas d'attente dans le navigateur Javascript. Tout est question de rappels. Rappelez-vous que vos rappels peuvent être des «fermetures», ce qui signifie des définitions de fonctions qui «capturent» des variables locales à partir du contexte dans lequel elles ont été créées.

Vous serez plus heureux si vous adoptez cette façon de faire.

+0

Même si vous pouvez attendre, vous demandez un navigateur non réactif en faisant cela. – JohnFx

+0

C'est assez juste. Mon but ici était d'établir avec certitude qu'il est réellement * impossible * de créer une fonction qui retourne une valeur obtenue par un callback. – jameshfisher

0

ajouter dans cette déclaration manquante :)

function get_expensive_thing(n) { 
    return fetch_from_disk(n, function(answer) { 
    return answer; 
    }); 
} 
+0

Peut-être que je ne l'ai pas précisé: dans cet exemple, 'fetch_from_disk' avait changé de comportement pour retourner le résultat via un callback. Donc, sa valeur de retour est en fait 'indéfinie'. – jameshfisher

+0

vous l'avez précisé, mais beaucoup de gens retournent aussi le résultat du rappel, pensez à fetch_from_disk (n, c) {return c (val)} - excuses si c'était du bruit :) – nathan

Questions connexes