2017-03-04 35 views
0

我正在嘗試使用NodeJS和Angular從文件夾讀取文件。我可以迭代文件夾並訪問文件數據,這裏沒有問題。 我的主要問題是我無法將結果(名稱數組)傳遞給$ scope並將其顯示給用戶 - 數組始終爲空。我認爲這與fs異步行爲有關。Angular + NodeJS:使用Promise(fs.fileRead和fs.readdir)從文件夾讀取文件

我做了以下內容:

角服務:

myApp.service('peopleService', ['$q', '$http', function($q, $http) { 

    var self = this; 
    this.people = []; 

    var peopleService = new Promise(function(resolve, reject) { 
     fs.readdir(folderPath, function(err, files) { 
      files.forEach(function(file) { 
       var obj; 
       fs.readFile(filePath, 'utf8', function (err, data) { 
        obj = JSON.parse(data); 

        var person = { name: obj.obituary.name, ... }; 

        self.people.push(person); 
       }); 
      }); 
     }); 

     resolve(self.people); 
    }).then(function(people) { 
     return people; 
    }); 

    return peopleService; 
}]); 

角控制器:

myApp.controller('homeController', ['$scope', '$http', 'peopleService', function($scope, $http, peopleService) { 

    $scope.people = []; 

    peopleService.then(function(people) { 
     $scope.people = people; 
     console.log($scope.people); //empty array (Array[0]) 
    }); 

}]); 

角頁:

<div class="list-group"> 
    <a href="#" class="list-group-item" ng-repeat="person in people"> 
     {{person.name}} 
    </a> 
</div> 

我在做什麼錯?

回答

1

爲什麼你將nodeJS代碼與angularJS代碼混合?

問題resolve(self.people)readdir之前執行和readFile回調被執行,因爲他們是異步的,所以你必須確保resolve(self.people)會後readdirreadFile回調執行:

new Promise(function(resolve, reject) { 
     fs.readdir(folderPath, function(err, files) { 
      var count = 0; 
      files.forEach(function(file) { 
       var obj; 
       fs.readFile(filePath, 'utf8', function (err, data) { 
        obj = JSON.parse(data); 

        var person = { name: obj.obituary.name, ... }; 

        self.people.push(person); 

        count++; 
        if(count === files.length){ 
         resolve(self.people); 
        } 
       }); 
      }); 
     }); 

    }).then(function(people) { 
     return people; 
    }); 
+0

感謝您的幫助@bougarfaoui 。我正在開發一個使用angularjs和electron的桌面應用程序。由於我需要訪問文件系統,我必須在角度內使用節點js。有其他選擇嗎?關於我的問題,您的解決方案解決了我的問題。 – Ricky

+0

@瑞奇哦抱歉,我忘了電子,沒有問題。不要忘記將我的解決方案標記爲正確的答案,thnx :)。 –