gpt4 book ai didi

JavaScript 异步 : Rerun the function on map

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:19 24 4
gpt4 key购买 nike

map 问题

我想映射数组,该数组重新运行函数tree(...)。然而,它返回了一系列的 promise ,这不是我所期望的。我需要它是异步的。

我期望返回的是一个具有以下格式的数组:

{ 姓名: '', 小路: '', 类型: '', 分机:'', children : [ ...与目录中所有文件相同的数组 ]}

var Os = require('os')
var Path = require('path')
var Fs = require('fs')

const P = Path.join(Os.homedir(), 'Desktop', 'Devior', 'Fixture');

class Tree {
constructor(path) {
this.path = path
this.tree(path)
}
async tree (path) {
let name = Path.basename(path)
let item = { path, name }
let stats = await this.stats_safe()

if(stats.isFile()) {
let ext = Path.extname(path).toLowerCase()

item.extension = ext
item.type = 'file'
}
else if(stats.isDirectory()) {
let data = await this.readdir_safe()

item.children = data
.map(child => this.tree(Path.join(path, child)))
.filter(e => !!e)
item.type = 'directory'
}
else { return null }
return item
}


// Utils

async stats_safe() {
return new Promise((resolve, reject) => {
Fs.stat(this.path, (err, stats) => {
if(err) reject(err)
resolve(stats)
})
})
}
async readdir_safe() {
return new Promise((resolve, reject) => {
Fs.readdir(this.path, (err, data) => {
if(err && err.code !== 'EACCES')
resolve(null)
if(err) reject(err)
resolve(data)
})
})
}
}



new Tree(P)

最佳答案

使用Promise.all()等到所有这些 promise 都得到解决,然后返回值数组。像这样的东西应该有效:

item.children = await Promise.all(data
.map(async (child) => await this.tree(Path.join(path, child)))

还有here是有关如何将映射和过滤器与 promise 数组一起使用的一些信息。值得一看

关于JavaScript 异步 : Rerun the function on map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com