我目前有一种连续轮询MediaDevices.enumerateDevices()的方法,该方法返回一组连接的媒体设备。

let devices = [];

function getDevices() {
    return new Promise(async (resolve, reject) => {
        try {
            const devices = await navigator.mediaDevices.enumerateDevices();
            resolve(devices);
        } catch (err) {
            reject(err);
        }
    });
}

async function listenForDeviceChanges() {
    devices = await getDevices();
    setTimeout(listenForDeviceChanges, 500);
}


(async () => {
    await listenForDeviceChanges();
})();


这似乎效率很低,所以我想知道MediaDevices API中是否还有其他方法可以做到这一点?特别是某种“观察者”方法。

最佳答案

是的,有一个devicechange事件:


  每当用户代理以及扩展到网站或应用程序可用的媒体设备集发生更改时,就会发生这种情况
  
  — https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/ondevicechange


例如。

navigator.mediaDevices.ondevicechange = function(event) {
  devices = await getDevices();
};

10-06 14:34