diff --git a/src/io/video.js b/src/io/video.js index 37b229804..dcecdbd05 100644 --- a/src/io/video.js +++ b/src/io/video.js @@ -100,26 +100,32 @@ class Video { */ disableVideo () { this.enabled = false; - // If we have begun a setup process, wait for it to complete + // If we have begun a setup process, call _teardown after it completes if (this._singleSetup) { this._singleSetup - .then(() => { - // we might be asked to re-enable before setup completes - if (!this.enabled) { - this._disablePreview(); - this._singleSetup = null; - // by clearing refs to video and track, we should lose our hold over the camera - this._video = null; - if (this._track) { - this._track.stop(); - } - this._track = null; - } - }) + .then(this._teardown.bind(this)) .catch(() => {}); } } + /** + * async part of disableVideo + * @private + */ + _teardown () { + // we might be asked to re-enable before _teardown is called, just ignore it. + if (this.enabled === false) { + this._disablePreview(); + this._singleSetup = null; + // by clearing refs to video and track, we should lose our hold over the camera + this._video = null; + if (this._track) { + this._track.stop(); + } + this._track = null; + } + } + /** * Return frame data from the video feed in a specified dimensions, format, and mirroring. * @return {ArrayBuffer|Canvas|string|null} Frame data in requested format, null when errors.