You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将使用callback回调函数的Node.js fs.readdir代码改写为Promise形式

fs.readdir 回调转Promise实现方案

以下提供3种常用的改写方案,可根据你的Node.js版本选择:

方案1:手动封装Promise

适合所有Node.js版本,无需引入额外依赖,逻辑最直观:

const fs = require('fs')

// 封装返回Promise的readdir方法
function readdirPromise(path) {
  return new Promise((resolve, reject) => {
    fs.readdir(path, (err, result) => {
      if (err) return reject(err)
      resolve(result)
    })
  })
}

// 调用方式1:then + catch链式调用
readdirPromise('/')
  .then(result => console.log(result))
  .catch(err => { throw new Error(err.message) })

// 调用方式2:async/await语法(更推荐,可读性更高)
async function getRootDirList() {
  try {
    const result = await readdirPromise('/')
    console.log(result)
  } catch (err) {
    throw new Error(err.message)
  }
}
getRootDirList()

方案2:使用util.promisify工具封装

Node.js v8以上版本支持,利用内置工具简化封装逻辑:

const fs = require('fs')
const { promisify } = require('util')

// 直接将回调式API转换为返回Promise的API
const readdirPromise = promisify(fs.readdir)

// 调用方式和方案1完全一致
async function getRootDirList() {
  try {
    const result = await readdirPromise('/')
    console.log(result)
  } catch (err) {
    throw new Error(err.message)
  }
}
getRootDirList()

方案3:直接使用内置fs Promise API

Node.js v10以上版本已内置promise版本的fs API,无需自行封装:

// Node v14及以上推荐写法
const fs = require('fs/promises')
// Node v10~v14版本可替换为 const fs = require('fs').promises

async function getRootDirList() {
  try {
    const result = await fs.readdir('/')
    console.log(result)
  } catch (err) {
    throw new Error(err.message)
  }
}
getRootDirList()

选型参考

  • Node.js >= v14:优先选方案3,代码最简洁
  • v10 <= Node.js < v14:可选方案2或方案3
  • Node.js < v10:选方案1或方案2

内容的提问来源于stack exchange,提问作者lian abdiansyah tanjung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:05