Las devoluciones de llamada que están en todas partes en JavaScript son un desastre para el control de procesos, y sus desventajas son obvias:
1. Sin un retorno explícito, es fácil generar procesos e errores innecesarios causados por ellos.
2. El código está anidado infinitamente y difícil de leer.
Hablemos de cómo resolver y evitar los problemas anteriores.
El primer problema es un problema de hábito. Cuando usan devolución de llamada, las personas a menudo se olvidan de usar el retorno. Esta situación es especialmente cierta cuando se usa café-script (aunque recopila los últimos datos como el valor de retorno cuando se compila en JavaScript, este valor de retorno no necesariamente representa su intención original). Eche un vistazo al ejemplo a continuación.
La copia del código es la siguiente:
a = (err, devolución de llamada)->
Callback () si err?
console.log 'me vamos'
b = ->
console.log 'Soy una devolución de llamada'
a ('error', b)
En este llamado estilo de código de "primer error", obviamente no queremos que el código posterior en el método A se ejecute cuando ocurra un error, pero no queremos usar el lanzamiento para que todo el proceso cuelgue (tiene que morir con gracia ~), por lo que el código anterior causará errores.
Una solución es escribir honestamente si ... más ..., pero prefiero lo siguiente:
La copia del código es la siguiente:
a = (err, devolución de llamada)->
devolver la devolución de llamada () si err?
console.log 'No me vemos'
b = ->
console.log 'Soy una devolución de llamada'
a ('error', b)
La mayoría de los valores de retorno en los métodos asíncronos de JavaScript son inútiles, por lo que aquí usamos el retorno como un rol de control de procesos, con menos código que si ... más ... pero más claro.
El segundo problema es que es difícil de erradicar.
Una buena manera es usar algunos módulos de control de procesos para que el código parezca más organizado. Por ejemplo, Async es un buen módulo que proporciona una serie de interfaces, que incluyen iteración, bucles y algunas declaraciones condicionales, e incluso un sistema de cola. Los siguientes ejemplos pueden usarse para describir las ventajas y desventajas de las dos formas de escribir nombres.
La copia del código es la siguiente:
#normal
Primero = (devolución de llamada)->
console.log 'Soy la primera función'
llamar de vuelta()
segundo = (devolución de llamada)->
console.log 'Yo soy la segunda función'
llamar de vuelta()
tercero = ()->
console.log 'Yo soy la tercera función'
Primero ->
Segundo ->
tercero()
# usa async
async = require ('async')
Async.waterfall [
primero,
segundo,
tercero
], (err)->
Como persona sabia, ¿cuál elegirías?