我有这个递归函数来遍历目录树以获取所有文件。不确定为什么fs.stat(path).isDirectory()在运行脚本时在不同文件上失败。当脚本多次运行时,结果不一致: - 当路径是目录时,fs.stat(path).isDirectory()返回false。 - 当路径是文件时,fs.stat(path).isDirectory()返回true。并且 - 脚本运行时没有错误。
const filesInDir$ = Rx.Observable.bindNodeCallback(fs.readdir)
const statFile$ = Rx.Observable.bindNodeCallback(fs.stat)
const getFiles = (dir = '') => {
const file$ = filesInDir$(dir)
.flatMap(f$ => f$)
.filter(file => file.indexOf('.spec') < 0)
const isDir$ = file$
.flatMap(file => statFile$(`${dir}/${file}`))
.map(f2 => {return {isDir: f2.isDirectory(), timestamp:
f2.mtime.getTime(), size: f2.size}});
return file$
.zip(isDir$, (file, obj) => {
console.log('file', file, obj, dir)
return ({file, obj})
})
.map(f => {
if(f.obj.isDir || f.file.indexOf('.') < 0) {
console.log('***dir', dir, f.file, f.obj.isDir)
return getFiles(`${dir}/${f.file}`)
} else if(f.file.indexOf('.') >= 0) {
return Rx.Observable.of({dir: dir, name: f.file, timestamp: f.obj.timestamp, size: f.obj.size});
}
}).flatMap(fobj => fobj)
};
答案 0 :(得分:0)
问题很可能是flatMap
没有保留调用的顺序。来自isDir$
的通知不一定按照与file$
相对应的顺序发出;它们将按照它们可用的顺序出现。
使用concatMap
确保订单正确无误:
const isDir$ = file$
.concatMap(file => statFile$(`${dir}/${file}`))
.map(f2 => ({
isDir: f2.isDirectory(),
timestamp: f2.mtime.getTime(),
size: f2.size
}));