链承诺在角度JS



这两个函数是我正在处理的音乐播放列表项目的控制器的一部分。在用户选择他的文件后,准备函数被调用来检查每个文件是否有效播放。完成后,调用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 个函数/承诺(promiseA、promiseB)组合成一个具有链式 promise 的函数,并且在所有完成后仍然得到 $q.all。谢谢。

因此,您文件中的每个函数都要一个接一个地调用(对于此问题域),然后尝试此操作。

如果函数 A 返回一个承诺,而函数 B

返回一个承诺,则函数 A 的承诺可以使用函数 B 的承诺进行解析。

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

相关内容

  • 没有找到相关文章

最新更新