Как создать сервис в Angular 7, который использует модуль FS для вывода списка файлов из каталога? - PullRequest
0 голосов
/ 16 ноября 2018

Я кодирую приложение на основе Node v10.13.0, Electron 3.0.7 и Angular 7.

Служба отвечает за обработку файлов, функция с именем ( listFiles ) считывает и возвращает массив имен файлов, содержащихся в каталоге.

    listFiles(path):Observable<string[]>{
    this.files_in_directories = [];

    return of(this.fs.readdir(path, function(err, items) {  
      if (err) {
        console.log(err);
        return;
      }
      for (var i=0; i<items.length; i++) {
          this.files_in_directories.push(items[i]);
          console.log(items[i]);
      }
      return this.files_in_directories;
    }.bind(this)));
  }

Мой код основан на Angular Guide: https://angular.io/tutorial/toh-pt4#observable-heroservice

В компоненте сервис называется:

 ngOnInit() {
    this.getScripts('Project');
  }

  getScripts(project){
    this.generalService.listFiles(this.config.location.datastore+'\\'+project).subscribe(files=>{
      this.scripts = files;
      this.cdref.detectChanges();
    });        
  }

Когда этот код выполняется, файлы читаются, но никогда не возвращаются, как наблюдаемые, вместо этого получается значение undefined (см. Изображение): Отладчик неопределенных значений

Я немного растерялся, как поступить с этого момента, файлы в каталоге правильно перечислены. Файл в консоли

Я полагаю, что проблема заключается в возврате массива внутри функции обратного вызова. Любые идеи.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

@ NishKal Kashyap, вы правы, прежде чем увидеть ваш ответ, я изменил код в сервисе для синхронного чтения файлов в каталоге.И работал просто отлично, спасибо за sugestion.

listFiles(path):Observable<string[]>{
    this.files_in_directories = [];
    this.fs.readdirSync(path).forEach(file => {
      this.files_in_directories.push(file);
    });

    return of(this.files_in_directories);
  }
0 голосов
/ 16 ноября 2018

Вы правильно определили проблему, возможно, измените ваш код следующим образом:

listFiles(path):Observable<string[]>{
this.files_in_directories = [];

this.fs.readdir(path, function(err, items) {  
  if (err) {
    console.log(err);
    return;
  }
  for (var i=0; i<items.length; i++) {
      this.files_in_directories.push(items[i]);
      console.log(items[i]);
  }
});

of(this.files_in_directories);
...