我正在经历雄辩的javascript,我很困惑为什么我对其中一个练习的解决方案不起作用。基本上,此脚本应采用正则表达式和一个或多个路径作为参数,然后输出一个与表达式相匹配的路径的数组。
'use strict';
async function search(path, re) {
const {stat, readdir} = require('mz/fs');
let match = [];
for (let i of path) {
let stats = await stat(i);
if (stats.isDirectory())
search(await readdir(i), re);
else if (await matched(i, re)) {
match.push(i);
}
}
return match;
}
function matched(file, re) {
const {createReadStream} = require('mz/fs');
let stream = createReadStream(file);
let m = false;
stream.on('data', chunk => {
if (chunk.toString().match(re)) {
//console.log('matched');
m = true;
}
});
return m;
}
let rgx = new RegExp(process.argv[2]);
let paths = process.argv.slice(3);
search(paths, rgx).then(x => console.log(x));
我想问题是m
在事件处理程序功能中未经修改。当我添加打印语句时,它们表明匹配发生了,但是m
没有修改。
我最终在线检查了解决方案,我有正确的想法,但是作者正在使用同步功能:
const {statSync, readdirSync, readFileSync} = require("fs");
let searchTerm = new RegExp(process.argv[2]);
for (let arg of process.argv.slice(3)) {
search(arg);
}
function search(file) {
let stats = statSync(file);
if (stats.isDirectory()) {
for (let f of readdirSync(file)) {
search(file + "/" + f);
}
} else if (searchTerm.test(readFileSync(file, "utf8"))) {
console.log(file);
}
}
我真的很想掌握JavaScript的异步风格,所以我希望有人可以帮助我修复我的异步解决方案。
此返回m;自stream.on('data'(以来,将首先执行;是异步。您可以做的是在匹配函数(文件,re(中添加一个回调,例如匹配函数(文件,re,cb(,然后使用stream.on中的回调('data'(;像cb(chunk.tostring((。匹配(re((;