Supposons que vous mainteniez une bibliothèque qui expose une fonction getData
. Vos utilisateurs l'appellent pour obtenir des données réelles:
var output = getData();
sous le capot, les données sont enregistrées dans un fichier, vous l'avez donc implémenté à l' getData
aide de Node.js intégré fs.readFileSync
. C'est évident à la fois getData
et ce fs.readFileSync
sont des fonctions de synchronisation. Un jour, on vous a dit de basculer la source de données sous-jacente vers un dépôt tel que MongoDB qui ne peut être accédé que de manière asynchrone. On vous a également dit d'éviter d'énerver vos utilisateurs,getData
API ne peut pas être modifiée pour renvoyer simplement une promesse ou exiger un paramètre de rappel. Comment répondez-vous aux deux exigences?
La fonction asynchrone utilisant le rappel / la promesse est l'ADN de JavasSript et Node.js. Toute application JS non triviale est probablement imprégnée de ce style de codage. Mais cette pratique peut facilement conduire à la soi-disant pyramide de callback of doom. Pire encore, si un code dans un appelant dans la chaîne d'appels dépend du résultat de la fonction asynchrone, ce code doit également être enveloppé dans la fonction de rappel, imposant une contrainte de style de codage à l'appelant. De temps en temps, je trouve le besoin d'encapsuler une fonction asynchrone (souvent fournie dans une bibliothèque tierce) dans une fonction de synchronisation afin d'éviter une refactorisation globale massive. La recherche d'une solution à ce sujet aboutissait généralement à des Node Fiberspackages ou npm dérivés. Mais Fibers ne peut tout simplement pas résoudre le problème auquel je suis confronté. Même l'exemple fourni par l'auteur de Fibers illustre la carence:
...
Fiber(function() {
console.log('wait... ' + new Date);
sleep(1000);
console.log('ok... ' + new Date);
}).run();
console.log('back in main');
Sortie réelle:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Si la fonction Fibre transforme réellement le sommeil de la fonction asynchrone en synchronisation, la sortie doit être:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
back in main
J'ai créé un autre exemple simple dans JSFiddle et je cherche du code pour produire la sortie attendue. J'accepterai une solution qui ne fonctionne que dans Node.js, vous êtes donc libre d'exiger n'importe quel package npm même si vous ne travaillez pas dans JSFiddle.