#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
возврата обещания до тех пор, пока приложение не перейдет в режим переднего плана.
Редактировать, протестированный код:
- 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.
}
- 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
помощью withconsole.log
, один снаружиsetTimeout
, а другой внутриsetTimeout
. Если приложение находится в фоновом режиме, оно отказывается запускатьconsole.log
внутреннююsetTimeout
часть.3. Пришлось бы догадаться, что цикл событий js приостановлен в режиме bg.