Запускать функцию по завершении события поиска - PullRequest
0 голосов
/ 07 мая 2020

У меня есть две функции:

async takeScreenShot() {
  this.pauseVideo();
  if (this.animations.length && !this.ended) {
    this.pauseLotties()
  }
  this.captures.push(this.canvas.toDataURL('image/webp'));
  if (!this.ended) {
    setTimeout(() => {
      this.takeScreenShot();
    }, 500);
  }
},

async pauseVideo() {
  console.log("currentTime", this.video.currentTime);
  console.log("duration", this.video.duration);
  this.video.pause();
  const oneFrame = 1 / 30;
  if (this.video.currentTime + oneFrame < this.video.duration) {
    this.video.currentTime += oneFrame;
  } else {
    this.video.play()
  }
}

Прямо сейчас я использую setTimeout, чтобы делать снимок экрана своего холста каждые 500 миллисекунд. Но я хотел бы сделать снимок экрана, используя событие seek с обещанием сообщить мне, когда он закончит поиск, чтобы я мог сделать снимок экрана. Таким образом, он должен копировать видео более эффективно и, возможно, быстрее. Как мне go это сделать?

Ответы [ 2 ]

1 голос
/ 07 мая 2020
takeScreenShot(){
return new Promise((resolve,reject)=>{
    this.video.addEventListener("seeked", ()=>{
        return resolve()
    });
})

}

и вызовите его, используя

    this.takeScreenShot().then(()=>{
          return this.pauseVideo()
     }).then(()=>{
console.log("Successfull completed")
})

Пожалуйста, узнайте, поможет ли это

0 голосов
/ 08 мая 2020

Это решение, которое я придумал. Хотя это было не совсем то, что предлагал Сандип Нагарадж, его комментарий существенно помог мне в поиске решения. Поэтому я проголосовал за его сообщение.

async takeScreenShot(){
  let seekResolve;
  this.video.addEventListener("seeked", async () => {
          if (seekResolve) seekResolve();
        });
await new Promise(async (resolve,reject)=>{
  console.log("promise running", this.video);
  if(!this.ended){
  if(this.animations.length){
    this.pauseLotties()
  }  
   this.pauseVideo();
  await new Promise(r => (seekResolve = r));
  this.layer.draw();
  this.captures.push(this.canvas.toDataURL('image/webp'));
  resolve()
  this.takeScreenShot()
    }
})
},
...