反应本机承诺和队列

时间:2020-04-30 12:50:39

标签: javascript reactjs react-native react-native-android react-native-navigation

我的项目中有本地化版本;在调用组件之前,我想调用setI18nConfig()方法,该方法负责语言。 但是,当我调用它时,首先要处理组件,然后再处理此方法。 也就是说,此方法成为队列中的最后一个。我认为这是因为诺言。 但是什么因素可以解决问题

App.js

import {setI18nConfig} from './src/localesConfig';
import StackNavigator from './src/routes/homeStack';

export default class App extends Component {
  constructor(props) {
    super(props);
    setI18nConfig(); // <---- here
  }

  render() {
    return (StackNavigator());
  }
}

localesConfig.js

export async function getCurrentLanguage() {
  try {
    return await AsyncStorage.getItem('Language');
  } catch (e) {
    // error reading value
  }
}

export const translationGetters = {
  // lazy requires (metro bundler does not support symlinks)
  en: () => require('./translations/en.json'),
  ru: () => require('./translations/ru.json'),
};

export const setI18nConfig = () => {
  i18n.missingTranslation = function(key) {
    return key;
  };
  // fallback if no available language fits
  const fallback = {languageTag: 'en', isRTL: false};

  const isRTL = fallback.isRTL;
  getCurrentLanguage().then(val => { //<----here quee
    const languageTag = val || fallback.languageTag;
    // clear translation cache
    translate.cache.clear();
    // update layout direction
    I18nManager.forceRTL(isRTL);
    // set i18n-js config
    i18n.translations = {[languageTag]: translationGetters[languageTag]()};
    i18n.locale = languageTag;
  });

homeBottomTabs.js

render() {
    return (
      <View>
        <Text>{translate('password')}</Text>
      </View>
    );
  }export default function RootTab() {
  return (
    <BottomTab.Navigator
      screenOptions={{gestureEnabled: false}}
      tabBarOptions={{
        tabStyle: {
          justifyContent: 'center',
          alignItems: 'center',
        },
        showIcon: false,
      }}>
      <BottomTab.Screen
        name="Main"
        component={MainScreen}
        options={{title: translate('Menu:Home'), headerShown: false}}
      />
      <BottomTab.Screen
        name="Chat"
        component={ChatScreen}
        options={{title: translate('Menu:Chat'), headerShown: false}}
      />
    </BottomTab.Navigator>
  );
}

然后在调用主屏幕时(即应用程序启动时),我得到this,但它应该像that

0 个答案:

没有答案