Первое, на что следует обратить внимание, это то, что getItem
возвращает JavaScript Promise
в соответствии с документацией . Работая JavaScript, мы не можем получить значения из Обещаний и экспортировать их без разрешения или отклонения Обещания, подробнее об этом здесь . Чтобы объяснить это с помощью вашего примера, вы можете присвоить значение к exportingLang, но он почти наверняка вернет исходный пустой объект {}
, к которому вы его инициализировали, потому что присвоение Promise происходит асинхронно, то есть ему нужно ждать чтобы система хранения нашла ключ @lang
, а затем верните его значение, которое может занять некоторое время (отсюда и необходимость в Promise).
Если смысл файла lang.js
состоит в том, чтобы не набирать текст операторы if снова и снова, тогда все в порядке (в противном случае я бы просто использовал Promise getItem
один раз в компоненте, в котором мне нужно значение). Сначала я должен убедиться, что мы экспортируем результаты, полученные из Обещания, следующим образом:
lang. js
export default AsyncStorage.getItem('@lang').then(language => {
let exportingLang = {name: 'default'};
if (language) {
if (language === 'hindi')
exportingLang = {
name: 'a hindi name',
};
else if (language === 'panjabi')
exportingLang = {
name: 'a panjabi name',
};
else
exportingLang = {
name: 'a english name',
};
}
return exportingLang;
});
Это, в свою очередь, даст мне другое Обещание в качестве экспорта.
Во-вторых, вы не можете использовать значения напрямую из Обещания в метод рендеринга React. Вам необходимо присвоить его состоянию, используя useState
или useEffect
. Вы можете прочитать больше об этом здесь .
Для простоты я использовал его в Component
следующим образом:
import langPromise from './lang';
export default class App extends Component {
state = {
lang: { name: '' },
};
async componentDidMount() {
const lang = await langPromise.then(lang => this.setState({ lang }));
}
render() {
return (
<View>
<Text>{this.state.lang.name}</Text>
</View>
);
}
}
Пожалуйста, дайте мне знать, если у вас есть еще вопросы.