这两个功能是我正在处理的音乐播放列表项目的控制器的一部分。用户选择文件后,调用prepare函数检查每个文件是否有效。完成后,调用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)组合成一个具有链式承诺的函数,并在完成所有操作后仍然获得$ q.all。感谢。
答案 0 :(得分: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