【问题标题】:Javascript Async: Rerun the function on mapJavascript Async:在地图上重新运行函数
【发布时间】:2018-03-17 06:47:47
【问题描述】:

地图问题

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

我期望返回的是具有这种格式的数组:

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

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)

【问题讨论】:

  • 我的回答对你有帮助吗?

标签: javascript node.js asynchronous ecmascript-6 es6-promise


【解决方案1】:

使用Promise.all() 等待所有这些承诺都解决,然后返回值数组。像这样的东西应该可以工作:

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

另外,here 是一些关于如何使用 map 和 filter 与 promise 数组的信息。值得一看

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多