Обратные вызовы, которые везде в JavaScript, являются катастрофой для управления процессом, и их недостатки очевидны:
1. Без явного возврата легко генерировать ненужные процессы и ошибки, вызванные ими.
2. Кодекс вложенного бесконечно и трудно читать.
Давайте поговорим о том, как решить и избежать вышеуказанных проблем.
Первая проблема - это проблема привычки. При использовании обратного вызова люди часто забывают использовать возврат. Эта ситуация особенно верна при использовании Coffee-Script (хотя она собирает последние данные в качестве возвращаемого значения при составлении в JavaScript, это возвратное значение не обязательно отражает ваше исходное намерение). Взгляните на пример ниже.
Кода -копия выглядит следующим образом:
a = (err, обратный вызов)->
Callback () Если ошибка?
console.log 'Вы увидите меня'
b = ->
console.log 'Я обратный вызов'
a ('error', b)
В этом так называемом стиле кода «First First», очевидно, мы не хотим, чтобы следующий код в методе A был выполнен, когда возникает ошибка, но мы не хотим использовать бросок, чтобы весь процесс вешал трубку (вы должны умирать изящно ~), поэтому вышеупомянутый код вызовет ошибки.
Одно решение - честно написать, если ... else ..., но я предпочитаю следующее:
Кода -копия выглядит следующим образом:
a = (err, обратный вызов)->
return callback (), если ошибся?
console.log 'Вы меня не увидите'
b = ->
console.log 'Я обратный вызов'
a ('error', b)
Большинство возвратных значений в асинхронных методах JavaScript бесполезны, поэтому мы используем возврат в качестве роли управления процессом, с меньшим кодом, чем если ... иначе ... но яснее.
Вторая проблема заключается в том, что это трудно искоренить.
Хорошим способом является использование некоторых модулей управления процессом, чтобы код выглядел более организованным. Например, Async - это хороший модуль, который обеспечивает ряд интерфейсов, включая итерацию, петли и некоторые условные утверждения, и даже систему очередей. Следующие примеры могут быть использованы для описания преимуществ и недостатков двух способов написания имен.
Кода -копия выглядит следующим образом:
#нормальный
First = (обратный вызов)->
console.log 'Я первая функция'
перезвонить()
Second = (обратный вызов)->
console.log 'Я вторая функция'
перезвонить()
третий = ()->
console.log 'Я третья функция'
первое ->
Второе ->
третий()
# Используйте Async
async = require ('async')
Async.waterfall [
первый,
второй,
третий
], (err)->
Как мудрый человек, какой из них вы бы выбрали?