Javascript 如何获得HTML5音频持续时间以显示和避免播放()和暂停()的错误

Javascript 如何获得HTML5音频持续时间以显示和避免播放()和暂停()的错误,javascript,angularjs,events,html5-audio,Javascript,Angularjs,Events,Html5 Audio,我在正确加载html5音频对象的音频时遇到问题。这是由于正在运行的函数:play()和pause()以及在完全加载之前返回的持续时间 以下是控制器中调用函数以获取音频持续时间的代码: if (audioLoadButtonWasPressed) { $timeout(function () { scope.duration = audioFactory.retrieveDuration().toFixed(1); }, 200); } 以下是检索过程: func

我在正确加载html5音频对象的音频时遇到问题。这是由于正在运行的函数:
play()
pause()
以及在完全加载之前返回的持续时间

以下是控制器中调用函数以获取音频持续时间的代码:

if (audioLoadButtonWasPressed) {
    $timeout(function () {
        scope.duration = audioFactory.retrieveDuration().toFixed(1);
    }, 200);
}
以下是检索过程:

function retrieveDuration() {
  audio.play();
  audio.pause();
  if(audio.readyState != 0) {
      audio.currentTime = 0;
  }
  return audio.duration;
}
我对这段代码有两个问题,它们有一个根本原因。由于
play()
pause()
同时运行,有时会出现错误,说明
pause()阻止play()运行
,然后audio.duration为
NaN
。但每次运行时,尽管如此,函数
getDuration()
总是在其具有值之前返回,从而导致
scope.duration
始终等于0.0


我尝试添加设置超时、承诺和其他内容,以使函数在返回之前等待,但它不起作用,
toFixed()
始终未定义,因为没有从
retrieveDuration()返回值。
。我发现了有关stackoverflow的问题,但我不知道如何使此事件侦听器工作。任何建议都会有帮助。谢谢大家!

对。我把那篇文章中的eventListener放在retrieveDuration中,console.log没有启动。我不这么认为。如果加载了持续时间,这个retrieveDuration将返回一个值,对吗?目前,它不返回值。但如果我在retrieveDuration中设置断点,它会返回一个值。就像我只需要等待一秒钟,但我不知道怎么做。是的,我想你是对的。“if.play()被阻塞”是什么意思?对我有用:非常好。当我将其放入retrieveDuration时,它确实会发出警报,但仍然显示为零。你知道为什么吗?我认为这可能与play()和pause()的位置有关,但移动它们并没有改变结果。