用babel编译的es2015类方法的递归方法调用

时间:2016-10-14 21:24:17

标签: javascript recursion ecmascript-6 babeljs electron

当我尝试递归调用实例方法时,我遇到了问题。

代码如下:

import fs from 'fs';
import fsWatcher from 'filewatcher';
import path  from 'path';

export default class SearchService {
initializeFileWatcher(foldersToWatch) {
    let result = fsWatcher();
    for (var i = 0; i < foldersToWatch.length; i++) {
        result.add(foldersToWatch[i]);
    }
    return result;
}

  getFilesFromDirectoriesRecursively(directories, fileExtension) {
    let result = [];

    for (var i = 0; i < directories.length; i++) {
        var dir = directories[i];
        var list = fs.readdirSync(dir);
        list.forEach(function (file) {
            file = dir + '/' + file;
            var stat = fs.statSync(file);
            if (stat && stat.isDirectory())
                result = result.concat(this.getFilesFromDirectoriesRecursively([file], fileExtension).bind(this));
            else
            if (path.extname(file) === fileExtension)
                result.push(file);
        });
    }
    return result;
}

getFilesFromDirectory(directory, fileExtension) {
    var result = [];
    var files = fs.readdirSync(directory);
    for (var i = 0; i < files.length; i++) {
       if (files[i].endsWith(fileExtension))
           result.push(files[i]);
    }
    return result;
}

}

使用babel-es2015编译代码并在电子应用环境中运行。当我尝试在其内部调用方法 getFilesFromDirectoriesRecursively 时,由于 this 指向es2015中的实例而不是转换后的代码,因此转换后的代码会遇到麻烦。 / p>

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我可以解决问题。正如@zerkms所提到的那样是使用 this 关键字false。我尝试将 this .bind关键字绑定,但这与匿名函数不兼容。

所以我应用了这里描述的解决方案:How to pass context to forEach() anonymous function

list.forEach( (file) => {
            file = dir + '/' + file;
            let stat = fs.statSync(file);
            if (stat && stat.isDirectory())
                result = result.concat(this.getFilesFromDirectoriesRecursively([file], fileExtension));
            else
            if (path.extname(file) === fileExtension)
                result.push(file);
        }, this);

现在它将 this 传递给forEach函数调用的闭包

编辑:

没有必要传递此信息,因为箭头功能正在执行此操作。

list.forEach( (file) => {
        file = dir + '/' + file;
        let stat = fs.statSync(file);
        if (stat && stat.isDirectory())
            result = result.concat(this.getFilesFromDirectoriesRecursively([file], fileExtension));
        else
        if (path.extname(file) === fileExtension)
            result.push(file);
});