使用 babel 转译的 es2015 class 方法的递归方法调用
Recursive method call on es2015 class method transpiled with babel
我在尝试递归调用实例方法时遇到问题。
代码如下所示:
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 编译并在 electron 应用程序环境中运行。不,当我尝试在其内部调用方法 getFilesFromDirectoriesRecursively 时,由于 this 指向 es2015 中的实例但不是在转译后的代码中。
我怎样才能解决这个问题?
我可以解决问题。正如@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);
});
我在尝试递归调用实例方法时遇到问题。
代码如下所示:
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 编译并在 electron 应用程序环境中运行。不,当我尝试在其内部调用方法 getFilesFromDirectoriesRecursively 时,由于 this 指向 es2015 中的实例但不是在转译后的代码中。
我怎样才能解决这个问题?
我可以解决问题。正如@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);
});