Les rappels que l'on voit partout en JavaScript sont un désastre pour le contrôle des processus, et les défauts sont évidents :
1. Sans retour explicite, il est facile de produire des processus redondants et les bugs qui en résultent.
2. Le code est infiniment imbriqué et difficile à lire.
Parlons de la façon de résoudre et d’éviter les problèmes ci-dessus.
Le premier problème est une question d'habitude. Lors de l'utilisation du callback, les gens oublient souvent d'utiliser return Cela est particulièrement vrai lors de l'utilisation de coffee-script (bien qu'il collecte lui-même le résultat final une fois compilé en javascript). est utilisée comme valeur de retour, mais cette valeur de retour ne représente pas nécessairement votre intention initiale). Jetez un œil à l’exemple ci-dessous.
b = ->
console.log 'Je suis un rappel'
a('erreur', b)
Dans ce style de codage dit « d'erreur d'abord », nous ne voulons évidemment pas que le code suivant dans la méthode a soit toujours exécuté lorsqu'une erreur se produit, mais nous ne voulons pas utiliser throw pour rendre l'ensemble du processus hang (ça doit être gracieux même si cela arrive) Bon sang ~), alors le code ci-dessus générera des bugs.
Une solution est d'écrire if...else... honnêtement, mais je préfère l'approche suivante :
b = ->
console.log 'Je suis un rappel'
a('erreur', b)
La plupart des valeurs de retourdans les méthodes asynchrones JavaScript sont inutiles, donc return est utilisé ici pour agir comme un contrôle de processus, ce qui est moins de code que if...else..., mais plus clair.
Le deuxième problème se pose dans le ventre de la mère et est difficile à éradiquer.
Un bon moyen consiste à utiliser certains modules de contrôle de flux pour rendre le code plus organisé. Par exemple, async est un bon module qui fournit une série d'interfaces, notamment l'itération, le bouclage et certaines instructions conditionnelles, et inclut même une mise en file d'attente. système. Les exemples suivants peuvent illustrer les avantages et les inconvénients des deux méthodes d'écriture
premier = (rappel)->
console.log 'Je suis la première fonction'
rappel()
seconde = (rappel)->
console.log 'Je suis la deuxième fonction'
rappel()
troisième = ()->
console.log 'Je suis la troisième fonction'
premier ->
deuxième ->
troisième()
async = require('async')
async.waterfall [
d'abord,
deuxièmement,
troisième
], (err)->