Ограничьте ожидание через Promise.race с таймером, но помните: это не отменяет запрос разрешения. Поздно полученный поток после timeout нужно остановить.
Как защититься от бесконечного Promise при запросе доступа к камере и микрофону? Предложи варианты с использованием статических методов Promise.
Ограничьте ожидание через Promise.race с таймером, но помните: это не отменяет запрос разрешения. Поздно полученный поток после timeout нужно остановить.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Ограничьте ожидание через Promise.race с таймером, но помните: это не отменяет запрос разрешения. Поздно полученный поток после timeout нужно остановить.
async function requestMedia(constraints, ms = 15000) {
let timer;
let abandoned = false;
const media = navigator.mediaDevices.getUserMedia(constraints).then(stream => {
if (abandoned) {
stream.getTracks().forEach(track => track.stop());
throw new Error('Request no longer needed');
}
return stream;
});
try {
return await Promise.race([
media,
new Promise((_, reject) => {
timer = setTimeout(() => {
abandoned = true;
reject(new Error('Permission wait timed out'));
}, ms);
})
]);
} finally {
clearTimeout(timer);
}
}
Покажите пользователю состояние ожидания и возможность повторить действие. Promise.all не решает зависание одного входа, а Promise.any с отклоняемым таймером тоже продолжит ждать успешный поток.