목차

비동기 코드는 구문이 실행되는 순서를 예측하기 어렵게 만든다. 이번 장에서는

4-1 비동기 프로그래밍의 어려움

비동기 프로그래밍 코드가 다루기 힘들어지는지 혹은 좋아지고 있는지를 인지하여야 한다. 그리고 코드가 통제하기 힘들어진다는 것을 미리 알고 이에 대한 최선의 해결책을 가지고 행동하여야 한다.

4-1-1 간단한 웹 스파이더 만들기

웹 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()라는 함수가 있다.

  1. 해당하는 파일이 존재하는지 확인하여 해당 URL에서 이미 다운로드했는지 검사. err가 존재하고 err.code가 ENOENT라면 파일이 존재하지 않으므로 파일을 생성
  2. 파일을 찾을 수 없다면 superagent를 통해 해당 URL 다운로드