我只想过滤掉给定路径中的目录.但是在异步模式下.

|-database
    |- more files...
|-events-list
    |- more files...
|-year-summary
    |- more files...
|-year-summary.xlsx

前三项是子目录.

#!/usr/bin/env node
const fs = require('fs')
const path = require('path')
const dir = 'C:\\Users\\xxx\\Development\\mbes32-events\\src\\reports'

function testSync() {
    let items = fs.readdirSync(dir)
    let dirs = items.filter(function (item) {
        let temp = fs.statSync(path.resolve(dir, item))
        return temp.isDirectory()
    })
    console.log({ dirs })
}

testSync()

result: { dirs: ['database', 'events-list', 'year-summary'] }

async function testAsync() {
    let items = await fs.promises.readdir(dir)
    let dirs = items.filter(async function (item) {
        let temp = await fs.promises.stat(path.resolve(dir, item))
        return temp.isDirectory()
    })
    console.log({ dirs })
}

testAsync()

result: { dirs: ['database', 'events-list', 'year-summary', 'year-summary.xlsx'] }

snyc功能按预期工作.但是async函数总是返回起始路径中的每一项.

我已经用了几个月了.但是今天我的程序因为这个失败而崩溃了.

提前感谢.:)

推荐答案

看看你的过滤功能,当你直接使用async与过滤器.

在不等待promise 兑现的情况下返回filter函数.

要使用异步筛选器,可以使用以下命令

async function asyncFilter(arr, predicate) {
    const results = await Promise.all(arr.map(predicate))
    return arr.filter(function (_v, index) {
        return results[index]
    })
}

async function testAsync() {
    let items = await fs.promises.readdir(dir)
    let dirs = await asyncFilter(items, async function (item) {
        let temp = await fs.promises.stat(path.resolve(dir, item))
        return temp.isDirectory()
    })
    console.log({ dirs })
}

通过使用自定义异步过滤函数,可以实现预期的行为.

使用async进行过滤有更多选项,您可以参考this article并进行详细解释.

免责声明:async filter代码片段也来自本文.归功于作者塔马斯·萨利.

Node.js相关问答推荐

在我的Next.js应用程序中没有正确设置Process.env.NODE_ENV

未显示NPM版本

函数声明中的异步在没有等待的函数中做什么?

如何模拟 mysql2 `getConnection`

结合后端(Express)和前端(Angular)路由

在 nodejs 中使用 multer 上传文件返回未定义的 req.file 和空的 req.body

使用 Forms API 进行批量更新时生成 itemId

用户与mongoose 的完美搭配

如何从 github 编译第三方扩展?

为什么需要在 NodeJS 应用程序中创建服务器?

Cypress net::ERR_EMPTY_RESPONSE 在真实服务器调用上

使用 $in 查询时,如何获取 mongoDB 中每个唯一 ID 的 n 个文档?

baseurl64 缓冲区解码

带有 node.js 和 express 的基本网络服务器,用于提供 html 文件和assets资源

如何在 Node.js 中逐字节读取二进制文件

带有加密的nodejs中的SALT和HASH密码

如何监控 node.js 上的网络,类似于 chrome/firefox 开发者工具?

Bootstrap 中的 Grunt 依赖冲突

Node应用程序中相同npm包的两个版本

Meteor - collection.find() 总是返回所有字段