Async/Await 返回值问题
发布于 8 年前 作者 leavesdrift 7526 次预览 最后一次回复是 8 年前 来自 问答
我想遍历存放markdown文件的目录,文件目录可能会有很多级,忽略隐藏目录(例如.git),最终目的是取出这个目录中所有的.md文件,返回包含这些文件绝对路径的数组。
// fs-promise.js
const fs = require('fs')
exports.readdir = function(dir){
return new Promise((resolve,reject) => {
fs.readdir(dir,(err,docs) => {
if(err){
reject(err)
return
}
resolve(docs)
})
})
}
exports.readFile = function(file,options){
return new Promise((resolve,reject) => {
fs.readFile(file,options,(err,data) => {
if(err){
reject(err)
return
}
resolve(data)
})
})
}
exports.readFiles = function(files,options){
let arr = []
for(let i=0;i<files.length;i++){
arr.push(new Promise((resolve,reject) => {
fs.readFile(files[i],options,(err,data) => {
if(err){
reject(err)
return
}
resolve([files[i],data])
})
}))
}
return arr
}
exports.stat = function(file){
return new Promise((resolve,reject) => {
fs.stat(file,(err,stats) => {
if(err){
reject(err)
return
}
resolve(stats)
})
})
}
exports.stats = function(files){
let arr = []
for(let i=0;i<files.length;i++){
arr.push(new Promise((resolve,reject) => {
fs.stat(files[i],(err,stats) => {
if(err){
reject(err)
return
}
resolve([files[i],stats])
})
}))
}
return arr
}
exports.writeFile = function(file,data,options){
return new Promise((resolve,reject) => {
fs.writeFile(file,data,options,(err) => {
if(err){
reject(err)
return
}
resolve()
})
})
}
exports.writeFiles = function(files,data,options){
let arr = []
for(let i=0;i<files.length;i++){
arr.push(new Promise((resolve,reject) => {
fs.writeFile(files[i],data,options,(err) => {
if(err){
reject(err)
return
}
resolve()
})
}))
}
return arr
}
const fs = require('./fs-promise')
,{resolve} = require('path')
,_ = require('lodash')
,re1 = /\.md$/
,re2 = /\/\./
const walk = async function(dir,mdList=[]){
const docs = await fs.readdir(dir)
_.forEach(docs,(doc,idx) => {
docs[idx] = resolve(dir,doc)
})
let props = await Promise.all(fs.stats(docs))
_.forEach(props,(prop) => {
let filename = prop[0]
,stat = prop[1]
if(stat.isFile() && re1.test(filename) && !re2.test(filename)){
mdList.push(filename)
}else if(stat.isDirectory() && !re2.test(filename)){
walk(filename,mdList)
}
})
}
walk('/home/cheng/node_projet/note')
现在问题就是我怎么取出mdList?
6 回复
我在
mdList.push(filename)前面敲console.log(filename)都能如下正常输出:错的太多了,重新学语法,不要强行写。
@ianchn 能详细说一下么?正在学习中
@leavesdrift forEach 那里 换成 for 里面 await walk(args),最后 return mdList, 最外层调用 walk(args).then(mdList => doSth(mdList))
@ianchn 还是不对
输出结果只有根目录的那个
.md文件,人生好难啊,看来不能跳genarator内部原理。@ianchn 我少打了
await,万分感谢,现在对了