【问题标题】:Uncaught SyntaxError while using setInterval Javascript [duplicate]使用 setInterval Javascript 时未捕获的 SyntaxError [重复]
【发布时间】:2018-05-10 14:42:45
【问题描述】:

我使用下面的代码每秒播放一个音频文件,音频文件是一秒长,基本上是一个滴答声。代码将只运行一次,然后我在控制台中看到错误。我的目的是让它每秒运行一次,直到实现某些目标,然后我才能清除间隔。这是我在控制台中遇到的错误

Uncaught SyntaxError: Unexpected identifier 
setInterval (async)

这是我的代码:

    $('select[name=notsound]').change(function(){
    var h = $(this).val();
    var tickAudio = new Audio('https://www.sample.com/sounds/'+h+'');
    setInterval(tickAudio.play(),1000);
    });

我不确定为什么会发生这种情况,我确信我犯了一些导致这个问题的错误,因为在我考虑给它一种不同的方法之前它已经工作了。感谢您阅读我的查询。 :)

【问题讨论】:

  • 您可能需要setInterval(tickAudio.play, 1000) 而不需要额外的(),否则您将每秒调用tickAudio.play() 的结果。
  • 尝试传递回调但不是结果setInterval(tickAudio.play,1000);
  • 当我这样做时,我得到这个错误 Uncaught (in promise) TypeError: Failed to execute 'play' on 'HTMLMediaElement': Illegal invocation
  • setInterval(tickAudio.play(),1000); => setInterval(tickAudio.play.bind(tickAudio),1000);setInterval(function() { tickAudio.play(); },1000);,请参阅链接问题的答案了解原因。
  • 您正在使用间隔/超时来确保在 play() 之前加载视频,最好将其删除并使用加载事件:$('select[name=notsound]').change(function (){ var h = $(this).val(); var tickAudio = new Audio(); tickAudio.onload = function(){ tickAudio.play(); } tickAudio.src ='sample.com/sounds/'+h+''; } );

标签: javascript jquery setinterval


【解决方案1】:

方法play需要在正确对象的上下文中调用:

var cleartick = setInterval(tickAudio.play.bind(tickAudio),1000);

@rmlan 的第二个建议也可以。

清除间隔是一样的——你不需要调用函数,而是将函数引用传递给setTimeout

setTimeout(clearInterval, 3000, cleartick);

setInterval/setTimeout 有一种将参数传递给定时器函数的便捷方式——如上面的cleartick

【讨论】:

  • 是的,这对我有用,也适用于 rmlan 的第二个建议。问题是我也在尝试清除间隔。这就是我正在做的事情,而且肯定是错误的。 var cleartick = setInterval(tickAudio.play.bind(tickAudio),1000);; setTimeout(clearInterval(cleartick), 3000);我不擅长Js。
  • 谢谢!这对我有用。 :)
【解决方案2】:

您当前每秒“执行”tickAudio.play() 的结果,而不是执行函数本身。

要解决这个问题,您可以将函数作为对象传递:

setInterval(tickAudio.play.bind(tickAudio),1000);

或者将调用包装在一个匿名函数中:

setInterval(function () { tickAudio.play() },1000);

【讨论】:

  • 第二个有效,它正在循环滴答声,我也尝试使用 setTimeout 在 3 秒后清除间隔。我不认为这可以清除间隔。 var cleartick = setInterval(function () { tickAudio.play() },1000); setTimeout(clearInterval(cleartick), 3000);好像我犯了同样的错误?
  • 这似乎是一个单独的问题,如果您仍然遇到问题,您应该问它。
猜你喜欢
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2021-04-23
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多