2017-03-04 7 views
0

NodeJSと角度を使ってフォルダからファイルを読み込もうとしています。フォルダを繰り返し処理してファイルデータにアクセスできますが、問題はありません。 私の主な問題は、私は$スコープに結果(配列の配列)を渡すことができず、ユーザーに表示することができない - 配列は常に空です。私はこれがfsの非同期動作に関連していると思います。私は、次のことをやっている角度+ NodeJS:約束のあるフォルダからファイルを読む(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前に実行されると、彼らは非同期であるので、あなたがresolve(self.people)readdirreadFileコールバックした後に実行されますことを確認する必要がありますのでreadFileコールバックは、実行されます。ヘルプ@bougarfaouiため

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

感謝。私はanglejsと電子を使ってデスクトップアプリを開発しています。私はファイルシステムにアクセスする必要があるので、角度の範囲内でノードjを使用する必要があります。代わりがありますか?私の質問に関して、あなたのソリューションは私の問題を解決しました。 – Ricky

+0

@リッキーオハイオ州申し訳ありませんが私は電子を忘れて、問題はありません。私の解決策を正しい答えとしてマークすることを忘れないでください、thnx :)。 –

関連する問題