Я думаю, что нет никакого прямого способа сделать это в JavaScript, поскольку это трудно проверить с помощью типов, поэтому я решил, что просто внесет изменения в мою структуру Firestore, добавив object
с именем refs
который будет содержать все ссылки, что упростит для меня повторение всех ссылок, поскольку я уверен, что все в поле refs
являются DocumentRef
s.
Когда вы вызываете асинхронный метод из вызывающего метода, этот метод также становится асинхронным. Попробуйте префикс async onComplete () {await this.retrieveData ()}
Есть несколько проблем, которые я вижу в вашем коде.
Во-первых, функция retrieveData()
. Он асинхронный и должен вызываться с await
, также вы получаете ошибку: Reference Error: ReferenceError:Can't find variable:retrieveData
, потому что вы не использовали this
Так что в идеале вы должны называть его await this.retrieveData();
mypin
, но, похоже, не передаете какой-либо параметр в функцию при его вызове. Чтобы решить эту проблему, вы должны назвать retreiveData()
следующим образом:
await this.retrieveData('mypin');
Или вы можете полностью удалить передачу параметра, что я покажу, как это сделать в моем рефакторе ниже. [1130 ]
Наконец, вы вызываете retreiveData
каждый раз, когда проверяете inputtedPin
, это не так эффективно, это asynchronous
, так что это может занять некоторое время, а во-вторых, для завершения функции setState
также требуется время Это означает, что состояние может не обновляться во времени, когда вы проверяете его по inputtedPin
, что означает, что вы проверяете inputtedPin
по неправильному значению.
Вот как я бы реорганизовал ваш компонент.
retrieveData
, так что он больше не принимает параметр, а ключ жестко закодирован в .getItem
componentDidMount
получить значение пина из AsyncStorage и сохранить его, чтобы заявить. retrieveData
из onComplete
Вот рефакторинг
retrieveData = async () => { // parameter have been removed
try {
let value = await AsyncStorage.getItem('mypin'); // notice I am now passing the key as a string not as a parameter
if (value !== null) {
console.log(value);
this.setState({ pin: value })
}
} catch (error) {
console.warn(err)
}
}
// here we call the refactored retrievedData which will set the state.
async componentDidMount () {
await this.retrieveData();
}
onComplete(inputtedPin, clear) {
// we remove the call to retrieveData as we have already gotten the pin in the componentDidMount
if (inputtedPin !== this.state.pin) {
ToastAndroid.show("Incorrect Pin", ToastAndroid.SHORT);
clear();
} else {
ToastAndroid.show("Pin is correct", ToastAndroid.SHORT);
clear();
this.props.navigation.navigate("Dashboard");
}
}
только заменить
retrieveData();
на
this.retrieveData();