Предупреждение: возможное отклонение необработанного обещания - PullRequest
0 голосов
/ 27 мая 2020

Когда я впервые открываю недавно созданное приложение, появляется следующее предупреждение. Я думаю, это потому, что ключ в AsyncStorage.getItem("KEY") не имеет значения, когда приложение запускается в первый раз. Как мне справиться с отклонением этого обещания?

warning output

this.state = {
      subjects: [],
      text: "",
      present_count: [0, 0, 0, 0, 0, 0, 0],
      total_count: [0, 0, 0, 0, 0, 0, 0],
      present: 0,
      total: 0
}
componentDidMount() {
    this._isMounted = true;
    Subjects.all(subjects => this.setState({ subjects: subjects || [] }));
    AsyncStorage.getItem("PRESENT_COUNT").then((value) => {
      this.setState({ present_count: JSON.parse(value || this.state.present_count) });
    });
    AsyncStorage.getItem("TOTAL_COUNT").then((value) => {
      this.setState({ total_count: JSON.parse(value || this.state.total_count) });
    });
    AsyncStorage.getItem("PRESENT").then((value) => {
      this.setState({ present: JSON.parse(value || this.state.present) });
    });
    AsyncStorage.getItem("TOTAL").then((value) => {
      this.setState({ total: JSON.parse(value || this.state.total) });
    });
  }

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Похоже, что AsyncStorage.getItem - это асинхронная операция. В этом случае для завершения операций getItem потребуется await. Вы можете использовать Promise.all, чтобы дождаться завершения методов getItem перед обновлением состояния.

async componentDidMount() {
  const getPresentCount = AsyncStorage.getItem('PRESENT_COUNT');
  const getTotalCount = AsyncStorage.getItem('TOTAL_COUNT');
  const getPresent = AsyncStorage.getItem('PRESENT');
  const getTotal = AsyncStorage.getItem('TOTAL');

  const [presentCount, totalCount, present, total] = await Promise.all([getPresentCount, getTotalCount, getPresent, getTotal]);
  this.setState({
    present_count: JSON.parse(value) || this.state.present_count,
    total_count: JSON.parse(value) || this.state.total_count,
    present: JSON.parse(value) || this.state.present,
    total: JSON.parse(value) || this.state.total,
  })
}
1 голос
/ 27 мая 2020

Один из способов - проверить, все ли value в порядке.

AsyncStorage.getItem("PRESENT_COUNT")
  .then((value) => {
    this.setState({
      present_count: value ? JSON.parse(value) : this.state.present_count
    });
  })

Другой способ - использовать блок catch

AsyncStorage.getItem("PRESENT_COUNT")
  .then((value) => {
    this.setState({
      present_count: JSON.parse(value || this.state.present_count),
    });
  })
  .catch((err) => {
    console.log(err);
    this.setState({ someState: "someVal" }); // if required...
  });

Наконец, вы также можете рассмотреть возможность использования обещания.all, как указано в другом ответе (от @wentjun). Просто обратите внимание, что если какой-либо из ваших вызовов api не удастся, вы в конечном итоге не установите никакого состояния. Также не забудьте использовать try catch при использовании async / await.

1 голос
/ 27 мая 2020

Вы можете использовать блок if внутри .then

AsyncStorage.getItem("KEY").then((value) => {
          if(value){
          this.setState({ present_count: JSON.parse(value || this.state.present_count) });
        }
        });
...