Les rappels qui sont partout en JavaScript sont une catastrophe pour le contrôle des processus, et leurs inconvénients sont évidents:
1. Sans rendement explicite, il est facile de générer des processus et des bogues inutiles causés par eux.
2. Le code est imbriqué infiniment et difficile à lire.
Parlons de la façon de résoudre et d'éviter les problèmes ci-dessus.
Le premier problème est un problème d'habitude. Lorsque vous utilisez un rappel, les gens oublient souvent d'utiliser le retour. Cette situation est particulièrement vraie lors de l'utilisation de Script Coffee-Script (bien qu'il collecte les dernières données comme valeur de retour lorsqu'elle est compilée en JavaScript, cette valeur de retour ne représente pas nécessairement votre intention d'origine). Jetez un œil à l'exemple ci-dessous.
La copie de code est la suivante:
a = (err, rappel) ->
callback () si err?
console.log 'vous me verrez'
b = ->
console.log 'Je suis un rappel'
a ('error', b)
Dans ce style de code dite "Erreur d'abord", nous ne voulons évidemment pas que le code suivant dans la méthode A soit exécuté lorsqu'une erreur se produit, mais nous ne voulons pas utiliser le lancer pour faire raccrocher l'ensemble du processus (vous devez mourir gracieusement ~), de sorte que le code ci-dessus provoquera des bogues.
Une solution consiste à écrire honnêtement si ... sinon ..., mais je préfère ce qui suit:
La copie de code est la suivante:
a = (err, rappel) ->
return callback () si err?
console.log 'vous ne me verrez pas'
b = ->
console.log 'Je suis un rappel'
a ('error', b)
La plupart des valeurs de retour dans les méthodes asynchrones JavaScript sont inutiles, donc nous utilisons ici le retour comme rôle de contrôle des processus, avec moins de code que si ... sinon ... mais plus clair.
Le deuxième problème est qu'il est difficile d'éradiquer.
Un bon moyen est d'utiliser certains modules de contrôle de processus pour rendre le code plus organisé. Par exemple, Async est un bon module qui fournit une série d'interfaces, y compris l'itération, les boucles et certaines instructions conditionnelles, et même un système de file d'attente. Les exemples suivants peuvent être utilisés pour décrire les avantages et les inconvénients des deux façons d'écrire les noms.
La copie de code est la suivante:
#normale
premier = (rappel) ->
console.log «Je suis la première fonction»
callback ()
deuxième = (rappel) ->
console.log 'Je suis la deuxième fonction'
callback ()
Troisième = () ->
console.log 'Je suis la troisième fonction'
Premièrement ->
deuxième ->
troisième()
# Utilisez Async
async = require ('async')
Asyncfules Async [
d'abord,
deuxième,
troisième
], (err) ->
En tant que sage, laquelle choisiriez-vous?