Не удалось получить данные из AsyncStorage

Я думаю, что нет никакого прямого способа сделать это в JavaScript, поскольку это трудно проверить с помощью типов, поэтому я решил, что просто внесет изменения в мою структуру Firestore, добавив object с именем refs который будет содержать все ссылки, что упростит для меня повторение всех ссылок, поскольку я уверен, что все в поле refs являются DocumentRef s.

0
задан DMC EXC 20 January 2019 в 07:28
поделиться

3 ответа

Когда вы вызываете асинхронный метод из вызывающего метода, этот метод также становится асинхронным. Попробуйте префикс async onComplete () {await this.retrieveData ()}

0
ответ дан Pradnya Choudhari 20 January 2019 в 07:28
поделиться

Есть несколько проблем, которые я вижу в вашем коде.

Во-первых, функция retrieveData(). Он асинхронный и должен вызываться с await, также вы получаете ошибку: Reference Error: ReferenceError:Can't find variable:retrieveData, потому что вы не использовали this

Так что в идеале вы должны называть его await this.retrieveData();

[1128 ] Есть еще несколько проблем с этой функцией. Вы используете параметр mypin, но, похоже, не передаете какой-либо параметр в функцию при его вызове. Чтобы решить эту проблему, вы должны назвать retreiveData() следующим образом:

await this.retrieveData('mypin');

Или вы можете полностью удалить передачу параметра, что я покажу, как это сделать в моем рефакторе ниже. [1130 ]

Наконец, вы вызываете retreiveData каждый раз, когда проверяете inputtedPin, это не так эффективно, это asynchronous, так что это может занять некоторое время, а во-вторых, для завершения функции setState также требуется время Это означает, что состояние может не обновляться во времени, когда вы проверяете его по inputtedPin, что означает, что вы проверяете inputtedPin по неправильному значению.

Code Refactor

Вот как я бы реорганизовал ваш компонент.

  1. Рефакторинг retrieveData, так что он больше не принимает параметр, а ключ жестко закодирован в .getItem
  2. В componentDidMount получить значение пина из AsyncStorage и сохранить его, чтобы заявить.
  3. Удалить вызов 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");
  }
}
0
ответ дан Andrew 20 January 2019 в 07:28
поделиться

только заменить

retrieveData();

на

this.retrieveData();
0
ответ дан miladsolgi 20 January 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: