在本机内部进行反应时,在useEffect

时间:2020-03-29 11:47:00

标签: reactjs react-native settimeout use-effect

如果应用执行X秒后满足特定条件,我最终希望向用户显示一个模式。

但是,我不断收到关于在Android上长时间(几分钟)设置定时器的警告,但是我的定时器只有几秒钟。

const surveyCheckTime = 3000; // X = 3 seconds

const App = () => {
  // First Time Modal State
  const [surveyVisibility, setSurveyVisibility] = useState(false);
  const handleSurveyOpen = () => {
    setSurveyVisibility(true);
  };
  const handleSurveyClose = () => {
    setSurveyVisibility(false);
  };

  useEffect(() => {
    const timer = setTimeout(() => {
      console.log('0:FROM_APP: Checking for condition: ');
      getData().then(
        keyValue => {
          console.log('0:FROM_APP: Completion status: ', keyValue);
          if (keyValue === 'false' || keyValue === undefined) {
            handleSurveyOpen();
          }
        },
        error => {
          // console.log('Survery_Error: ', error);
        },
      );
    }, surveyCheckTime);

    return () => clearTimeout(timer);
  }, []);

  return (
      <View>
         ...
        <SurveyModal
          surveyVisibility={surveyVisibility}
          handleSurveyClose={handleSurveyClose}
        />
      </View>
  )

getData()是一个异步函数,返回keyValue作为Promise。

export const getData = async (myKey = 'alreadyOpened') => {
  try {
    const value = await AsyncStorage.getItem(`@${myKey}`);
    if (value !== null) {
      // value previously stored
      // console.log('FROM__getData: Stored previously: ', value);
      return value;
    }
  } catch (e) {
    // error reading value
    console.log('ERROR:FROM__getData: Cannot read: ', e);
    return 'fasle';
  }
};

一切都很好,一切都按预期进行,但我每次都在不同的最后一行收到此警告:

(看到setTimeout的持续时间为Y ms)Y远高于我的X值

setTimeout Warning

this个问题,但就我而言,它与Firebase并不完全相关。 (尽管我确实使用firebase来获取另一个组件中的数据,但这不应该成为问题。)这是问题

我已经研究过this,但是大多数解决方案要么更改了“ node_modules”,要么禁用了警告,因此该主题已经过时了。

最好是有一种更有效的超时解决方案。

编辑:“ firebase”:“ 7.13.1”是导致获取数据时出现问题的原因

1 个答案:

答案 0 :(得分:0)

我使用了过时的Firebase集成,这导致了此问题(Web配置而不是.json文件)