2016-05-18 10 views
0

Я разрабатываю приложение IOS, используя React Native и Reflux. Когда пользователь открывает какой-то actionSheetIOS, я запускаю действие, которое заставляет хранилище делать асинхронный запрос. Хранилище хранит коллекцию всех экземпляров возвращаемых данных и передает все данные во все виды, которые подписываются на этот набор данных. Однако, поскольку для одного из параметров ActionSheet требуются данные, возвращаемые этим запросом, я не могу гарантировать, что данные будут готовы, когда пользователь нажмет на эту опцию. Как я могу гарантировать, что данные (async) готовы, когда пользователь нажимает на параметр actionSheetIOS?Как я могу гарантировать, что данные (async) готовы, когда пользователь нажимает на параметр actionSheetIOS?

Надеюсь, я смог объяснить это достаточно хорошо. Кроме того, я относительно знаю React/Reflux, поэтому я могу вообще что-то упустить.

ответ

0

Не можете ли вы вызвать ActionSheetIOS, пока данные не будут готовы? Что-то вроде этого ...

<TouchableOpacity 
 
    onPress={() => { 
 
      // call the async method first 
 
      runSomeAsyncMethod() 
 
      .then((data) => { 
 
      // wait until the method finishes before triggering ActionSheetIOS 
 
      ActionSheetIOS.showActionSheetWithOptions({ 
 
       options: BUTTONS, 
 
       cancelButtonIndex: CANCEL_INDEX, 
 
       destructiveButtonIndex: DESTRUCTIVE_INDEX, 
 
       }, 
 
       (buttonIndex) => { 
 
       this.setState({ clicked: BUTTONS[buttonIndex] }); 
 
       }); 
 
      } 
 
      }} 
 
> 
 
    <Text>Click Me!</Text> 
 
</TouchableOpacity>

Это предполагает, что ваш метод является обещание ... но вы должны получить идею.

+0

Спасибо Brad, что это хорошее предложение. Я попробую это посмотреть, как это происходит, но эта реализация может замедлить не-асинхронные параметры, предоставляемые ActionSheet (Slow API-запрос, когда пользователь не будет нажимать на эту опцию). Кроме того, вызванная функция async вызвана действием reflux, которое не отвечает непосредственно на это представление. Однако, поскольку запрашиваемые данные не являются частью большего набора данных, запускающего приложение, я могу изменить его запрос. – generalchaos

0

То, что я нашел для работы лучше всего (до сих пор), заключается в возвращении обещания, как если бы это были запрошенные данные. Promise будет содержать асинхронный запрос и разрешение с требуемыми данными.

Обработчик onPress будет выглядеть следующим образом:

onPress = {()=>{ 
    returnedPromise.then((requestData)=>{ 
    // do something with requestedData 
    }).catch(()=>{ 
    // oops.. time to handle the error 
    }) 
}}