addEventListener和angularjs promise:将它包起来

时间:2016-05-09 09:25:56

标签: javascript angularjs javascript-events angular-promise

我正试图在绘制事件侦听器/处理程序之间的界限以及使用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?

1 个答案:

答案 0 :(得分:3)

在文件下载期间看起来fileload会触发,因此如果您想在下载后处理文件,则不需要。您只需completeerror。你可以把它包装在一个承诺

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!");
});