2017-03-04 143 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 :)。 –