React Native прослушивает изменения переменных

#react-native #react-native-android #react-native-ios

#react-native #react-native-ios

Вопрос:

Я пытаюсь создать приложение, которое позволит мне обновлять текстовое поле после получения изменения переменной. Однако обновление переменной занимает много времени, и await не работает, чтобы дождаться обновления моей переменной, вероятно, из-за функции тайм-аута, которую я использовал. Как мне создать прослушиватель или что-то в этом роде, чтобы проверять наличие изменений переменных?

Ниже приведен мой фрагмент кода

 const [banana, setBanana] = useState(-1);
  const updateLocation = async() => {
    const majorSig = scheduledScan();
    setBanana(majorSig);
  }

  const scheduledScan = async() => {
  beaconScan();

  // Scans for 20 seconds
  setTimeout( async()=> {
    beaconStop();
    await getAndUpdateUserLoc();
    // console.log("Loggged: ", await getUserLoc());
    // console.log("major: ", await getSignificantMajor());
    currentMajor = await getSignificantMajor();
    return currentMajor;
  }, 20000);
}
  

Когда я запускаю UpdateLocation(), мой код должен выполняться в течение 20 секунд. Я хочу, чтобы он подождал, пока не завершит выполнение scheduledScan() и вернет значение в majorSig, прежде чем запускать функцию setState . Однако прямо сейчас все, что он делает, это запускает scheduledScan() и немедленно обновляет setState до неправильного значения. Что я должен сделать, чтобы заставить его вести себя так, как я хочу?
Спасибо.

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

1. Почему бы не установить состояние внутри таймаута вместо возврата значений?

Ответ №1:

Во-первых, в вашей функции async UpdateLocation отсутствует оператор await. Давайте добавим это соответствующим образом:

 const updateLocation = async () => {
  const majorSig = await scheduledScan();
  setBanana(majorSig);
};
  

Тогда было бы неплохо, если бы вы придерживались подхода promise в своей функции с ограниченным временем, используя a Promise.race , который позволяет вашей функции либо истекать, либо успешно возвращать значение:

 const scheduledScan = async () => {
  beaconScan();
  return Promise.race([
    async () => {
      beaconStop();
      await getAndUpdateUserLoc();
      // console.log("Loggged: ", await getUserLoc());
      // console.log("major: ", await getSignificantMajor());
      currentMajor = await getSignificantMajor();
      return currentMajor;
    },
    new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), 20000)),
  ]);
};