Как лучше всего передать обещание между экранами и ожидать результата, сокращая время ожидания? - PullRequest
0 голосов
/ 30 января 2020

Мое намерение состоит в том, чтобы сократить время ожидания пользователей при переходе на экран, который требует данных от API.

В настоящее время это что-то вроде этого, где fetchSomeData возвращает обещание:

// Screen 1
this.navigateToScreenTwo()

// Screen 2
async componentDidMount(){
  try {
    const data = await fetchSomeData()
    this.setState({ data })
  } catch(e){}
}

Что я хочу сделать, так это запустить обещание, передать его на следующий экран в состоянии навигации и затем дождаться его результата на следующем экране. Поскольку переход по экрану занимает 300 мс, этого времени достаточно для получения результата от API, что делает переход и загрузку данных плавными.

Является ли хорошей практикой делать что-то подобное? Если нет, то какой будет лучший способ сделать это?

// Screen 1
const dataPromise = fetchSomeData() // purposely without await
this.navigateToScreenTwo({ dataPromise }) // pass promise in navigation

// Screen 2
async componentDidMount(){
  try {
    const data = await this.navigation.dataPromise // the promise from navigation state
    this.setState({ data })
  } catch(e){}
}

Менее важно: должна ли быть попытка / уловка на экране 1, где обещание впервые возвращается?

1 Ответ

0 голосов
/ 30 января 2020

Вероятно, это может сработать, если вы убедились, что нет проблем с реализацией navigateToScreenTwo, и если это достаточно простое приложение.

Но это не очень поддерживаемая стратегия и не следует обычным шаблонам React. Вместо этого я бы использовал систему управления состоянием, которая работает между компонентами, такими как React Context, Mobx, Redux или любой из множества других вариантов. Задание asyn c завершится обновлением состояния приложения, и его вообще не нужно будет передавать.

При попытке / перехвате на экране 1 будут обнаруживаться только синхронные ошибки, а не обещание отклонения. Вряд ли это необходимо в большинстве случаев, но это зависит от того, может ли fetchSomeData выдать ошибку синхронно (до возврата обещания).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...