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

时间:2018-02-19 02:46:40

标签: javascript node.js

我正在阅读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的异步风格,所以我希望有人可以帮我修复我的异步解决方案。

1 个答案:

答案 0 :(得分:0)

此返回m;将从stream.on('data')开始执行;是异步的。你可以做的是在函数匹配(file,re)中添加一个回调函数,如函数匹配(file,re,cb),然后使用stream.on('data')中的回调;比如cb(chunk.toString()。match(re));