我正试图在绘制事件侦听器/处理程序之间的界限以及使用angularjs解决承诺之间的界限。
我在处理音频的angularjs服务中使用PreloadJS 该服务被用作另一个服务的依赖项,一旦文件被预加载就需要能够执行某些操作(因此使用了一个承诺)。
但我对于如何将它们全部包装起来还没有任何线索......
所以,经典的代码:
// Event handlers
audio.queue.addEventListener('fileload', function(event) {
console.log('charging file', event);
// do some things while loading (.notify)
});
audio.queue.addEventListener('complete', function(event) {
console.log('file loaded', event);
// do some things once it's loaded (.resolve)
});
audio.queue.addEventListener('error', function(event) {
console.log('error while charging file', event);
// do some things in case of error (.reject)
});
// Preload a file
audio.queue.loadFile({id: 'test', src: 'test.mp3'});
我该怎么办? A. $ q.all关于由3个回调提供的一系列承诺? B.我没有B ......
任何帮助或线索将不胜感激
回应C14L answer。我们承认我们有:
var file1 = 'test.mp3' //file exists
var file2 = 'azepsl.mp3' //file doesnt exist
var file3 = 'test2.mp3' //file exists
C14L code由于1个文件不存在,我拒绝了3个承诺 如果我使用普通的旧eventHandler,如上所示,我有2个成功事件和1个失败(这很正常)。
这个问题可能是什么原因?
可能是因为有几个eventListeners被添加到audio.queue?
答案 0 :(得分:3)
在文件下载期间看起来fileload
会触发,因此如果您想在下载后处理文件,则不需要。您只需complete
和error
。你可以把它包装在一个承诺
function download_me_stuff(){
audio.queue.loadFile({id: 'test', src: 'test.mp3'});
return new Promise(function (resolve, reject) {
audio.queue.addEventListener('complete', function(event) {
console.log('file loaded', event);
resolve(event);
});
audio.queue.addEventListener('error', function(event) {
console.log('error while charging file', event);
reject(event);
});
}
}
现在可以
download_me_stuff().then(
function do_me_things (event) {
// ...
},
function handle_me_error (event) {
// ...
}
);
那是你要的吗?我可能误会了。
修改强>
我查看了fileload spec,看起来每次队列中的一个单独文件成功加载后,就会触发此事件。
audio.queue.addEventListener('fileload', function(event) {
console.log('one more file loaded', event);
});
在成功加载所有文件后触发complete
事件。在您的示例中,您只加载了一个文件,但允许使用3个文件。它们都被添加到文件队列
audio.queue.loadFile({id: 'test1', src: 'test1.jpg'});
audio.queue.loadFile({id: 'test2', src: 'test2.jpg'});
audio.queue.loadFile({id: 'test3', src: 'test3.jpg'});
您可能希望每次加载单个文件时都做出反应并对该文件执行操作。虽然你可以把它包装成单独的承诺,但它会让事情复杂化。最好简单地定义回调
audio.queue.addEventListener('fileload', oneSingleFileLoaded);
function oneSingleFileLoaded(event) {
var id = event.item.id; // 'id' of this item from loadFile() above
var type = event.item.type;
if (type == createjs.LoadQueue.IMAGE) {
document.getElementById('#'+id).appendChild(event.result);
}
}
其他两个事件只是为了方便起见,让您知道整个队列是否已成功加载。在大多数情况下可能不那么重要
audio.queue.addEventListener('complete', function(event) {
alert('Wohooo, everything downloaded successfully!')
});
audio.queue.addEventListener('error', function(event) {
alert("Well, that didn't work. Hit [F5] and try again!");
});