Javascript 我如何才能为播放声音的结束做出承诺?

Javascript 我如何才能为播放声音的结束做出承诺?,javascript,angularjs,html5-audio,Javascript,Angularjs,Html5 Audio,我有一个加载声音的简单JavaScript: prefix = 'modules/sounds/'; _sounds = ['nameOfSound','nameOfSound','nameOfSound']; for (var sound in _sounds) { if (_sounds.hasOwnProperty(sound)) { var cached = _sounds[sound];

我有一个加载声音的简单JavaScript:

  prefix = 'modules/sounds/';
 _sounds = ['nameOfSound','nameOfSound','nameOfSound'];


 for (var sound in _sounds) {
                if (_sounds.hasOwnProperty(sound)) {
                    var cached = _sounds[sound];
                    cached.audio = new Audio(prefix + cached.src);
                    }
                }
            }
所有内容都缓存在这里,然后在angular中,我有一个服务可以执行以下功能:

 this.play = function(trackName) {
        _sounds[trackName].audio.play();
    };
我想要的是一个简单的声音承诺,所以当我调用它时,我会有这样的东西:

soundService.play('boom').then(function(){
    do something here
});

这可能吗?

音频播放结束时,会发出一个“结束”事件


您可以创建一个通用对象,可以实现该对象以适应您的设置:

function play(url) {
     return new Promise(function(resolve, reject) {   // return a promise
         var audio = new Audio();                     // create audio wo/ src
         audio.preload = "auto";                      // intend to play through
         audio.autoplay = true;                       // autoplay when loaded
         audio.onerror = reject;                      // on error, reject
         audio.onended = resolve;                     // when done, resolve

         audio.src = path + url + suffix; // just for example
     });
}
现在您可以拨打:

play("boom").then(function() {

});
由于音频元素的缓冲行为,缓存它们没有什么意义。指示预加载将告诉浏览器您希望通过音频文件播放。在我看来,这对客户机和系统也更好

例子
功能播放(url){
返回新承诺(函数(解析、拒绝){//返回承诺
var audio=new audio();//创建音频wo/src
audio.preload=“auto”//打算通过
audio.autoplay=true;//加载时自动播放
audio.onerror=reject;//出现错误时,拒绝
audio.onended=resolve;//完成后,解析
audio.src=url
});
}
播放(示例)。然后(函数(){
警报(“完成!”);
})

变量样本=“数据:音频/wav;base64,UklgiriaoABXQVZFZM10IBaaaabaaabaa71yaao9waaabaaabaagazgf0yfsnaccogkagykgoggogogbgib/foCAf35+fn19fx19fx1+focggagagagcafn5+fnx8fn5/f3+agicbgykcgg4ocgib/fn5+gibb/gibgGf5+gibgGf5/gibgGf5+f5+fx8fFn5+fx8fX8fxfxxxxxxxx9fn59fn19f21+foB/f19+gibgGbGbgibgibgibgibgibgibgibgibgibgib+f5+f5+f5+ff5+fgggGf5+fgGygGygGfGyGyGfff5+fn+fn+fn+fn+fn+fn+fn+fn+词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词++词词++词++词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词+词ffn+f4+f4+f4+f6+f6+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+f4+EYAMGNV3HOYCDXMJJOJ2FIQ6.6 6六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六DD9VML6EWD5WSBL8QFGUVAJE2.2 2 6六六六六六六6六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六六K2.在一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校,一个学校一个学校,一个学校一个学校,一个学校一个学校一个学校,一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个学校一个jaidm5xe4qoh32.B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B 4ZGN0JJQTFGLLCIGTMOT1BG96I5ESFNBVIWPKIV4DNUBG4AHHYF+ENRGYGHJRCYSUKOJZC3UEIOMCFX6AF32AIIYIGNP1EKJYH+DHJ4PGRHZVDYAQJ3NYCGN6GoodFH3FOSHHOB5DHR9H4UHFXRYD4GMJ4R0BNADJIP+EHQAHIWAHYSENUG4WEFYFEN8CNQEYFEN4FYGEN9FHZDYKJ4FYKJ7P+GOBYKJ5FIKJ7P+GOBYKJ9FYKJ9FYKJ9FYKJ9FYKJ9FYKJ9FYK9FYKYK9FYKJ9FYK+G9FYK+G9FYKJ9FYKJ9FYKJ9FYKGffx6+Gfffx6+Gffffx6+Gfffff8+Gfffff8+Gffff8+Gfff8+Gfff8+Gff8+Gfff8 8+Gf8+Gff8+Gff6+Gf8+Gf8+Gf8+Gf6 6 6+Gf8 Gf8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G8 G9GOSCG6.这是一个关于某一领域的研究的结果。例如,一个关于某一领域的研究,例如,一个10+GG9+GG9+F6+F6+中国的一个6+中国的6+中国的6+中国的6+中国的6+G6+G6+G6+G6+G6+G6+G6+G6+G6+G6+G6+G9+G9+G9+G9+F6+F6+F6+中国6+中国6+中国的6+6+中国的6+中国的6+中国的6+中国6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国的6+中国AFNT8F4(2)HoHoHoIffff3(4)fffff3(4)fff2(2)HoHoHof3(4)fff3(ff3)fff3+Ghob5(5)目前的某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某5+foCCgn5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffCBGX9+fn+AgYGAfn2A5.这是一个GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGBGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGYGAGICBGYF+fn19fX1+fx19fycgogbgh5+fn5/fn18foGBgH17e36Cg4F+fH6Ag4KAfX1/gYKCgYCAf4CAgICBgH
play("boom").then(function() {

});
app.service('service', ['$q', function($q){
    this.play = function play(sound) {
        var deferred = $q.defer();
        sound.play();
        sound.onended = function(e) {
          deferred.resolve(e);
        }
        return deferred.promise;
    }
}]);