2016-10-14 3 views
0

インスタンスメソッドを再帰的に呼び出すときに問題が発生しています。es2015クラスメソッドの再帰メソッド呼び出しがバベルでトランベイルされた

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; 
} 

}

コードはバベル-es2015でtranspiledを取得し、電子アプリ環境で実行されます:

コードは次のように見えます。いいえ、私はメソッドを呼び出すときにgetFilesFromDirectoriesRecursivelyのため、トランスコードされたコードは、トランスコードされたコードではなく、es2015のインスタンスを指しています。

この問題を回避するにはどうすればよいですか?

+2

これは匿名機能内で使用するため、「this」はあなたが思うとは言いません。 http://stackoverflow.com/q/3127429/251311 – zerkms

+0

「この問題を回避するにはどうしたらいいですか?」 'list.forEach(function(file){'を 'list.forEach(file => {'。 – noppa

答えて

0

私はこの問題を解決できました。 @zerkmsが言及しているように、このキーワードはfalseです。 .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); 

を今すぐそのの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); 
}); 
+0

に移す必要はありません)を変更することで、ES6の矢印構文への変更だけで問題を解決することができます – Alnitak

関連する問題