Angular + NodeJS:使用 Promises 从文件夹中读取文件(fs.fileRead 和 fs.readdir)
Angular + NodeJS: Read Files From Folder With Promises (fs.fileRead and fs.readdir)
我正在尝试使用 NodeJS 和 Angular 从文件夹中读取文件。我能够遍历文件夹并访问文件数据,这里没有问题。
我的主要问题是我无法将结果(名称数组)传递给 $scope 并将其显示给用户 - 该数组始终为空。我认为这与 fs 异步行为有关。
我正在执行以下操作:
Angular 服务:
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;
}]);
Angular 控制器:
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])
});
}]);
Angular 页数:
<div class="list-group">
<a href="#" class="list-group-item" ng-repeat="person in people">
{{person.name}}
</a>
</div>
我做错了什么?
为什么要将 nodeJS 代码与 angularJS 代码混合?
问题是 resolve(self.people)
在 readdir
之前执行,而 readFile
回调是异步执行的,所以你必须确保 resolve(self.people)
会在之后执行readdir
和 readFile
回调:
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;
});
我正在尝试使用 NodeJS 和 Angular 从文件夹中读取文件。我能够遍历文件夹并访问文件数据,这里没有问题。 我的主要问题是我无法将结果(名称数组)传递给 $scope 并将其显示给用户 - 该数组始终为空。我认为这与 fs 异步行为有关。
我正在执行以下操作:
Angular 服务:
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;
}]);
Angular 控制器:
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])
});
}]);
Angular 页数:
<div class="list-group">
<a href="#" class="list-group-item" ng-repeat="person in people">
{{person.name}}
</a>
</div>
我做错了什么?
为什么要将 nodeJS 代码与 angularJS 代码混合?
问题是 resolve(self.people)
在 readdir
之前执行,而 readFile
回调是异步执行的,所以你必须确保 resolve(self.people)
会在之后执行readdir
和 readFile
回调:
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;
});