Рекурсивный вызов метода класса es2015, переданный с помощью 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 и работает в среде электронного приложения. Нет, когда я пытаюсь вызвать метод getFilesFromDirectoriesRecursively внутри себя, у транспилируемого кода возникают проблемы из-за this, которые указывают на экземпляр в es2015, но не в транспилированном коде.

Как я могу обойти эту проблему?


person Oliver    schedule 14.10.2016    source источник
comment
Это не проблема транспиляции - this не относится к тому, что, по вашему мнению, он там делает, поскольку вы используете его в анонимной функции. Прочитайте stackoverflow.com/q/3127429/251311   -  person zerkms    schedule 15.10.2016
comment
How can I get around this problem?. Изменив list.forEach(function (file) { на list.forEach(file => {.   -  person noppa    schedule 15.10.2016


Ответы (1)


Я мог решить проблему. Как уже упоминалось, @zerkms использовал ключевое слово this false. Я попытался связать this с ключевым словом .bind, что не работает с анонимными функциями.

Поэтому я применил решение, описанное здесь: Как передать контекст 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);
        }, 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);
});
person Oliver    schedule 15.10.2016
comment
передача контекста здесь не нужна - просто изменения синтаксиса стрелки ES6 должно быть достаточно, чтобы решить проблему - person Alnitak; 15.10.2016