1

この 2 つの関数は、私が取り組んでいる音楽プレイリスト プロジェクトのコントローラーの一部です。ユーザーが自分のファイルを選択した後、準備関数が呼び出されて、各ファイルが再生可能かどうかがチェックされます。完了すると、getIDtags が呼び出され、ID3tags データが各ファイルに追加されます。

       var preparePlaylist = function (files){

            var allPromises = [],
                currentSongsListLength = $scope.songsList.length || 0;

            $.each(files, function (index){                    
                var file = files[index];
                file.index = index + currentSongsListLength;
                var promiseA = FileValidator2.check(file);
                allPromises.push(promiseA);
                promiseA
                    .then (function (file){
                    SharedService.addSong(file.index, file);
                });
            });

           $q
                .all(allPromises)
                .then(function () {                        
                    console.log('Check Resolved!');
                    console.log('SharedService updated.');
                    getID3tags();
           });
        };


        var getID3tags = function (){
            var ID3tagsPromises = [];

            $.each($scope.songsList, function(index){
                var promiseB = ID3tags.getTags($scope.songsList[index]);
                ID3tagsPromises.push(promiseB);
                promiseB
                    .then( function (file){
                        SharedService.addSong(file.index, file);
                    });
            });

            $q
                .all(ID3tagsPromises)
                .then(function () {                        
                    console.log('ID3tags Resolved!');
                    console.log('SharedService updated.');                        
            });

        };   

2 つの関数/promise(promiseA、promiseB) をチェーンされた promise で 1 つの関数に結合し、すべてが完了したときに $q.all を取得する方法。

4

1 に答える 1

1

したがって、ファイル内の各関数は、(この問題のドメインに対して) 次々に呼び出されてから、これを試してください。

functionA が promise を返し、functionB が promise を返す場合、functionA の promise は functionB からの promise で解決できます。

function preparePlaylist(){
    var finished = $q.defer();
    // rest of function body
    $q.all(allPromises).then(function(){
        //Do whatever you need
        finished.resolve(getID3tags());
    });
    return finished.promise;

function getID3tags(){
    var finished = $q.defer();
    //rest of function body
    $q.all(ID3tagsPromises).then(function(){
        //Do whatever you need
        finished.resolve('Done both preparePlaylist and getID3tags');
    });
    return finished.promise;

preparePlaylist.then(function(response){
    console.log(response);
});

これには少し調整が必要かもしれませんが、うまくいくはずです。ただし、テストしていません。それが役に立てば幸い!

参照用ドキュメント: http://docs.angularjs.org/api/ng .$q

于 2013-09-30T18:01:41.140 に答える