Как защититься от бесконечного Promise при запросе доступа к камере и микрофону? Предложи варианты с использованием статических методов Promise.

Ограничьте ожидание через Promise.race с таймером, но помните: это не отменяет запрос разрешения. Поздно полученный поток после timeout нужно остановить.

Короткий ответ

Что ответить на собеседовании

Ограничьте ожидание через 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 с отклоняемым таймером тоже продолжит ждать успешный поток.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее