我正在阅读Eloquent JavaScript,我很困惑为什么我的one of the exercises解决方案不起作用。基本上,此脚本应采用正则表达式和一个或多个路径作为参数,然后输出一个包含与表达式匹配的路径的数组。
'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的异步风格,所以我希望有人可以帮我修复我的异步解决方案。
答案 0 :(得分:0)
此返回m;将从stream.on('data')开始执行;是异步的。你可以做的是在函数匹配(file,re)中添加一个回调函数,如函数匹配(file,re,cb),然后使用stream.on('data')中的回调;比如cb(chunk.toString()。match(re));