JavaScript의 모든 곳에있는 콜백은 프로세스 제어를위한 재난이며, 그들의 단점은 분명합니다.
1. 명백한 반품이 없으면 불필요한 프로세스와 버그를 쉽게 생성 할 수 있습니다.
2. 코드는 무한히 중첩되어 읽기가 어렵습니다.
위의 문제를 해결하고 피하는 방법에 대해 이야기합시다.
첫 번째 문제는 습관 문제입니다. 콜백을 사용할 때 사람들은 종종 반환을 사용하는 것을 잊어 버립니다. 이 상황은 커피 스크립트를 사용할 때 특히 그렇습니다 (JavaScript로 컴파일 된 경우 마지막 데이터를 리턴 값으로 수집하지만이 반환 값이 원래 의도를 반드시 나타내는 것은 아닙니다). 아래 예를 살펴보십시오.
코드 사본은 다음과 같습니다.
a = (err, 콜백)->
콜백 () err err?
console.log '당신은 나를 볼 것입니다'
b = ->
console.log '나는 콜백'
a ( '오류', b)
이 소위 "오류 첫"코드 스타일에서는 오류가 발생할 때 메소드 A의 후속 코드를 실행하기를 원하지 않지만 전체 프로세스를 끊기 위해 던지기를 사용하고 싶지 않으므로 (위의 코드로 인해 버그가 발생합니다.
한 가지 해결책은 정직하게 쓰는 것이 ... 다른 경우 ...하지만 다음을 선호합니다.
코드 사본은 다음과 같습니다.
a = (err, 콜백)->
반환 콜백 () err 일 경우?
Console.log '당신은 나를 볼 수 없습니다'
b = ->
console.log '나는 콜백'
a ( '오류', b)
JavaScript 비동기 메소드의 대부분의 리턴 값은 쓸모가 없으므로 여기서는 프로세스 제어 역할로 리턴을 사용합니다.
두 번째 문제는 근절하기가 어렵다는 것입니다.
좋은 방법은 일부 프로세스 제어 모듈을 사용하여 코드를보다 정리하는 것입니다. 예를 들어, Async는 반복, 루프 및 조건부 명세서 및 큐 시스템을 포함한 일련의 인터페이스를 제공하는 좋은 모듈입니다. 다음 예제는 이름을 쓰는 두 가지 방법의 장점과 단점을 설명하는 데 사용될 수 있습니다.
코드 사본은 다음과 같습니다.
#정상
첫 번째 = (콜백)->
Console.log '나는 첫 번째 기능입니다'
콜백 ()
두 번째 = (콜백)->
console.log '나는 두 번째 함수'
콜백 ()
셋째 = ()->
Console.log '나는 세 번째 기능'
첫 번째 ->
두 번째 ->
제삼()
# 비동기 사용
async = require ( 'async')
Async.waterfall [
첫 번째,
두번째,
제삼
], (err)->
현명한 사람으로서 어떤 사람을 선택 하시겠습니까?