비동기 코드는 구문이 실행되는 순서를 예측하기 어렵게 만든다. 이번 장에서는
비동기 프로그래밍 코드가 다루기 힘들어지는지 혹은 좋아지고 있는지를 인지하여야 한다. 그리고 코드가 통제하기 힘들어진다는 것을 미리 알고 이에 대한 최선의 해결책을 가지고 행동하여야 한다.
웹 URL을 입력으로 받아 해당 URL의 내용을 로컬 파일로 다운로드하는 간단한 콘솔용 어플리케이션이다.
사용되는 npm 종속성 라이브러리들은 다음과 같다.
import fs from 'fs'
import path from 'path'
import superagent from 'superagent'
import mkdirp from 'mkdirp'
import { urlToFilename } from './utils.js'
export function spider (url, cb) {
const filename = urlToFilename(url)
fs.access(filename, err => { // [1]
if (err && err.code === 'ENOENT') {
console.log(`Downloading ${url} into ${filename}`)
superagent.get(url).end((err, res) => { // [2]
if (err) {
cb(err)
} else {
mkdirp(path.dirname(filename), err => { // [3]
if (err) {
cb(err)
} else {
fs.writeFile(filename, res.text, err => { // [4]
if (err) {
cb(err)
} else {
cb(null, filename, true)
}
})
}
})
}
})
} else {
cb(null, filename, false)
}
})
}
다운로드할 URL과 다운로드 프로세스가 완료될 때 호출될 콜백 함수들을 취하는 spider()라는 함수가 있다.