如何将使用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
相关产品推荐
相关产品推荐

