Os retornos de chamada que estão em toda parte do JavaScript são um desastre para o controle de processos, e suas desvantagens são óbvias:
1. Sem um retorno explícito, é fácil gerar processos e bugs desnecessários causados por eles.
2. O código é aninhado infinitamente e difícil de ler.
Vamos falar sobre como resolver e evitar os problemas acima.
O primeiro problema é um problema de hábito. Ao usar o retorno de chamada, as pessoas costumam esquecer de usar o retorno. Essa situação é especialmente verdadeira ao usar o script de café (embora coleta os últimos dados como o valor de retorno quando compilado em JavaScript, esse valor de retorno não representa necessariamente sua intenção original). Dê uma olhada no exemplo abaixo.
A cópia do código é a seguinte:
a = (err, retorno de chamada)->
retorno de chamada () se err?
console.log 'você vai me ver'
b = ->
console.log 'eu sou um retorno de chamada'
a ('erro', b)
Nesse chamado estilo de código de "erro", obviamente, não queremos o código subsequente no método A a ser executado quando ocorrer um erro, mas não queremos usar o arremesso para fazer o processo inteiro desligar (você precisa morrer graciosamente ~), para que o código acima cause erros.
Uma solução é escrever honestamente se ... mais ..., mas eu prefiro o seguinte:
A cópia do código é a seguinte:
a = (err, retorno de chamada)->
retornar retorno de chamada () se err?
console.log 'você não vai me ver'
b = ->
console.log 'eu sou um retorno de chamada'
a ('erro', b)
A maioria dos valores de retorno nos métodos assíncronos JavaScript é inútil, então aqui usamos o retorno como uma função de controle de processo, com menos código do que se ... senão ... mas mais claro.
O segundo problema é que é difícil erradicar.
Uma boa maneira é usar alguns módulos de controle de processo para que o código pareça mais organizado. Por exemplo, o Async é um bom módulo que fornece uma série de interfaces, incluindo iteração, loops e algumas declarações condicionais e até um sistema de filas. Os exemplos a seguir podem ser usados para descrever as vantagens e desvantagens das duas maneiras de escrever nomes.
A cópia do código é a seguinte:
#normal
primeiro = (retorno de chamada)->
console.log 'eu sou a primeira função'
ligar de volta()
segundo = (retorno de chamada)->
console.log 'eu sou a segunda função'
ligar de volta()
terceiro = ()->
console.log 'eu sou a terceira função'
primeiro ->
segundo ->
terceiro()
# Use assíncrono
assync = requer ('assíncrono')
async.waterfall [
primeiro,
segundo,
terceiro
], (err)->
Como uma pessoa sábia, qual você escolheria?