修改事件处理程序中的外部变量



我正在经历雄辩的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((;

最新更新