Ошибка приложения Android при использовании Promise в фоновом режиме

#javascript #android #react-native #promise

#javascript #Android #react-native #обещание

Вопрос:

Моя цель — отложить метод на 1 секунду. Обещание отлично работает в режиме переднего плана. Если он используется в фоновом режиме, он выдаст необработанное обещание.

Кодекс

 const recorderStop = async () => {
  await new Promise((resolve) => setTimeout(resolve, 1000)); // used to delay.
  ... the code I wish to invoke...
}
 

Ожидаемое поведение:

Код ожидает 1 секунду, прежде чем вызвать остальную часть кода.

Фактическое поведение:

Код зависает и ожидает await new Promise возврата обещания до тех пор, пока приложение не перейдет в режим переднего плана.

Редактировать, протестированный код:

  1. setTimeout с обещанием возврата
 const recorderStop = async () => {
  console.log('before the setTimeout');
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.log('after the setTimeout'); // this code will not be invoked while in the background mode.
}
 
  1. setTimeout без возврата обещания.

код

 const recorderStop = async () => {
  console.log('outside the timeout');
  setTimeout(async () => {
    console.log('inside timeout'); // this code is not invoked while in the background mode.
  }, 1000);
}
 

На выходе, the console.log('inside timeout') is not invoked while in the background mode.

 [Sat Dec 12 2020 16:10:59.517]  LOG      recorder is recording
[Sat Dec 12 2020 16:11:01.980]  LOG      recorderStop(): outside timeout
 

Комментарии:

1. Если вызывающий абонент recorderStop не должен знать о возможном завершении кода, тогда вы можете использовать un-promisified setTimeout() . В любом случае, вы можете попробовать это, чтобы помочь диагностировать проблему.

2. @Roamer-1888 Я думаю, проблема в setTimeout том, что . Я создал метод с setTimeout помощью with console.log , один снаружи setTimeout , а другой внутри setTimeout . Если приложение находится в фоновом режиме, оно отказывается запускать console.log внутреннюю setTimeout часть.

3. Пришлось бы догадаться, что цикл событий js приостановлен в режиме bg.