Node.jsで同期処理をさせる方法4つ

fsライブラリのreaddirを使っていろいろな方法で同期実行をしてみます。

  • Promise
  • fs.promises
  • promisify
  • 同期メソッド

Promise

一般的なPromiseを使って同期実行をさせてみます。

const fs = require('fs')

const fileList = new Promise((resolve, reject)=>{
    fs.readdir('.', (err, files)=>{
        if (err) reject(err)
        resolve(files)
    })
})

fileList.then(files => {
    console.log(files)
})

fs.promises

fs.promisesというインスタンスを使うといきなりPromiseオブジェクトが返ってきます。

v10.0.0以降で使用可能です。

const fs = require('fs')

const fileList = fs.promises.readdir('.', (err, files)=>{
    if (err) throw err
    return files
})

fileList.then(files => {
    console.log(files)
})

promisify

utilというライブラリのpromisifyというメソッドを使うとPromiseオブジェクトを返すように一発で変換できます。

但し、promisifyを使う場合は最後の引数がcallbackかつcallbackの第一引数がエラーになっている場合のみ使えます。

v8.0.0以降で使用可能です。

const fs = require('fs')
const util = require('util')

const fileList = util.promisify(fs.readdir)('.')

fileList.then(files => {
    console.log(files)
})

同期メソッド

今回の場合のような単純に同期的に実行する場合であれば最初から同期のメソッドを使えば最も完結に書けます。

const fs = require('fs')

const fileList = fs.readdirSync('.')
console.log(fileList)