Javascript 如何使特定功能脱离setInterval循环>;

Javascript 如何使特定功能脱离setInterval循环>;,javascript,setinterval,Javascript,Setinterval,我用setInterval()方法编写了以下代码。但是,两者之间有一个函数,即audio.play()。无论何时调用setInterval,都会再次调用整个函数,因此音频会一次又一次地播放。是否有任何方法可以运行setInterval()方法,但audio.play部分有例外? 这是密码 setInterval(async () => { //api stuff const detections = await faceapi .detectAllFaces(v

我用setInterval()方法编写了以下代码。但是,两者之间有一个函数,即audio.play()。无论何时调用setInterval,都会再次调用整个函数,因此音频会一次又一次地播放。是否有任何方法可以运行setInterval()方法,但audio.play部分有例外? 这是密码

setInterval(async () => {
    //api stuff
    const detections = await faceapi
      .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions());
    const resizedDetections = faceapi.resizeResults(detections, displaySize);
    const happy  =resizedDetections[0].expressions.happy;

    //The Issue  starts from here
    if(happy>0.9)
    {
      audio.src="audios/happy_audio.wav";
      audio.play();
    }

    faceapi.draw.drawDetections(canvas, resizedDetections);
    faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
  },1000)
})

如果希望在播放时不播放,可以通过检查条件中的
暂停
属性来检查音频当前是否正在播放:

setInterval(async () => {
    //api stuff
    const detections = await faceapi
      .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions());
    const resizedDetections = faceapi.resizeResults(detections, displaySize);
    const happy  =resizedDetections[0].expressions.happy;

    //The Issue  starts from here
    if(!audio.paused && happy>0.9)
    {
      audio.src="audios/happy_audio.wav";
      audio.play();
    }

    faceapi.draw.drawDetections(canvas, resizedDetections);
    faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
  },1000)
})

如果您只想让它发射一次,请使用标志:

let flag = false;

setInterval(async () => {
    //api stuff
    const detections = await faceapi
      .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions());
    const resizedDetections = faceapi.resizeResults(detections, displaySize);
    const happy  =resizedDetections[0].expressions.happy;

    //The Issue  starts from here
    if(flag && happy>0.9)
    {
      audio.src="audios/happy_audio.wav";
      audio.play();
      flag = true;
    }

    faceapi.draw.drawDetections(canvas, resizedDetections);
    faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
  },1000)
})

注意我不太喜欢全局范围的变量标志。在上述情况下,我建议使用闭包,或者将异步函数绑定到包含该标志的对象,但作为一个示例,这应该足够了:)

正如在注释中已经说过的那样,最好将要运行一次的代码移出
setInterval

但是如果你真的想把它放在里面,那么你可以使用一个只允许运行一次的布尔变量

以下是如何:

let isFirstRun = true;

setInterval(async () => {
    //api stuff
    const detections = await faceapi
      .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions());
    const resizedDetections = faceapi.resizeResults(detections, displaySize);
    const happy  =resizedDetections[0].expressions.happy;

    //The Issue  starts from here
    if(isFirstRun) {
        isFirstRun = false;

        if(happy>0.9)
        {
          audio.src="audios/happy_audio.wav";
          audio.play();
        }
    }
    faceapi.draw.drawDetections(canvas, resizedDetections);
    faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
  },1000)
})

我明白了。因此,您希望在快乐指数>0.9时立即停止间隔

let intervalID = setInterval(async () => {
    //api stuff
    const detections = await faceapi
      .detectAllFaces(video, new faceapi.TinyFaceDetectorOptions());
    const resizedDetections = faceapi.resizeResults(detections, displaySize);
    const happy  =resizedDetections[0].expressions.happy;

    //The Issue  starts from here
    if(!audio.paused && happy>0.9)
    {
      audio.src="audios/happy_audio.wav";
      audio.play();
      clearInterval(intervalID); // to stop next interval
      return; // to stop current interval
    }

    faceapi.draw.drawDetections(canvas, resizedDetections);
    faceapi.draw.drawFaceExpressions(canvas, resizedDetections);
  },1000)
})

为什么不将代码移出setInterval(),这样它只执行一次?
setInterval
不仅运行代码,它还返回一个标识符,您可以使用它来再次停止操作。话虽如此,如果只需要触发一次,不要使用
setInterval
。只要调用你的函数,可能是事件侦听器的一部分。在设置间隔之前,音频是否具有src属性?@Alex TinLe先生,面部api实际上应该在每1000毫秒重新渲染一次后才能工作,因此需要不断地重新渲染-rendering@Mike“Pomax”Kamermans先生,人脸检测api需要不断地重新运行程序我使用了setInterval方法。先生,问题是我需要再次恢复setInterval功能,比如说在音频结束后。另外,我还需要运行其他函数,以便获得正确的视频提要,在应用clearInterval()方法后,该提要会冻结。我不明白,所以在中断interval循环之后。您希望在视频结束后再次启动循环。然后,您需要做的就是在视频结束时再次触发间隔。问题是什么>?先生,我实际上需要音频独立运行,但是如果我们停止间隔直到音频播放,视频馈送就会中断。因此,在完全不了解您的问题之前,费用不会发生变化。