Воспроизведение видео петли, используя обещание сцепления и setTimeout


Ну это может показаться излишним, учитывая многочисленные темы о взаимодействии между обещаниями и предыдущий метод setTimeout, но я не могу найти ответ, что именно подойдет в моем случае (или что я способен интерпретировать !)

В случае с видео проигрыватель использования API, мне нужно, чтобы петли на последовательности, и выход из цикла при определенном условии достигается.

Следующий код работает, но мне было интересно, если там было более сексуальным способом, используя обещание сцепления вместо этого :

export class LoopStep {
// looping from 0 to 5 seconds in the video
this.duration = 5; 
this.start = 0;

onStart() { // entry point
    return this.onLoop();
}

onLoop() {
    return new Promise((resolve) => {
        this.loopAndResolve(resolve);
    });
}

loopAndResolve(resolve) { // start loop
    if(this.isLooping) { // exit condition when turned to false
        this.player.setTime(this.start);
        this.player.play();
        setTimeout(this.loopAndResolve.bind(this, resolve), this.duration * 1000); // callback
    } else {
        resolve();
    }
}
}

// Anywhere else
loopStep.onStart.then(()=> console.log('exiting loop successfully')); // OK

На самом деле я хотел найти больше присваивали, чтобы избежать прохождения "решить" функцию в качестве параметра (только потому, что у меня ощущение, что это может быть неправильно, или, по крайней мере, не "самый эффективный/сексуальный").



287
1
задан 5 февраля 2018 в 01:02 Источник Поделиться
Комментарии
1 ответ

Вы могли бы попробовать что-то вроде этого:

export class LoopStep {
public onStart(): Promise<void> { // entry point
return this.onLoop();
}

private onLoop(): Promise<void> {
return this.loopAndResolve();
}

private loopAndResolve(): Promise<void> { // start loop
if (this.isLooping) { // exit condition when turned to false
this.player.setTime(this.start);
this.player.play();
setTimeout(() => this.loopAndResolve(), this.duration * 1000);
} else {
return Promise.resolve();
}
}
}

// Anywhere else
loopsStep.onStart().then(() => console.log('exiting loop successfully')); // OK

Одна из лучших вещей, машинопись является безопасность типов. Это легче отслеживать обещания, переходя от одной функции к другой, если вы объявляете их в возвращаемый тип.

В вашем случае, когда вы просто хотите более рациональный способ решения Promiseможно использовать Promise.resolve();. Он довольно прост в использовании и очень полезна. Документы

(Не забудьте о круглых скобках при вызове onStart!)

0
ответ дан 7 февраля 2018 в 09:02 Источник Поделиться