react native firebase async ожидает parellel с promise.all

#javascript #reactjs #react-native #async-await #es6-promise

#javascript #reactjs #react-native #асинхронный-ожидает #es6-обещание

Вопрос:

 import fire from '../config/fire';
const db = fire.firestore();
class InitialDb extends Component {
  constructor(props) {
    super(props);
    this.state = {
      schools: '',
      students: '',
    };
  }
  async componentDidMount() {
    const { size: schools } = await db.collection('schools').get();
    const { size: students } = await db.collection('students').get();

    this.setState({ schools, students});
  }
  render() {
    return (
      <SafeAreaView>
        {/* <StatusBar translucent backgroundColor='#1b75ce' />
        <HC title='Dashboard' /> */}
        <BackButton />
        <View style={{ paddingTop: 10, marginBottom: 20 }}>
          <View style={{ flexDirection: 'row' }}>
            <View style={styles.widthstyle}>
              <TouchableOpacity>
                
                  <Card>
                    <CardItem>
                      <Body>
                        <View style={{ flexDirection: 'row' }}>
                          <Image
                            style={{ width: 30, height: 30 }}
                            source={require('../assets/schools.png')}
                          />
                          <Text style={{ textAlign: 'center' }}>
                            Schools:{this.state.schools}
                          </Text>
                        </View>
                      </Body>
                    </CardItem>
                  </Card>
                
              </TouchableOpacity>
            </View>
            <View style={styles.widthstyle}>
              <TouchableOpacity>
                
                  <Card>
                    <CardItem>
                      <Body>
                        <View style={{ flexDirection: 'row' }}>
                          <Image
                            style={{ width: 30, height: 30 }}
                            source={require('../assets/asd.png')}
                          />
                          <Text style={{ textAlign: 'center' }}>
                            Students:{this.state.students}
                          </Text>
                        </View>
                      </Body>
                    </CardItem>
                  </Card>
                
              </TouchableOpacity>
            </View>
          </View>
          <View
            style={{ flexDirection: 'row' }}
            //   style={styles.basic1Style}
          >
            <View style={styles.widthstyle}>
              <TouchableOpacity>
                <Card>
                  <CardItem>
                    <Body>
                      <View style={{ flexDirection: 'row' }}>
                        <Image
                          style={{ width: 30, height: 30 }}
                          source={require('../assets/def.png')}
                        />
                        <Text style={{ textAlign: 'center' }}>
                          Office:50
                        </Text>
                      </View>
                    </Body>
                  </CardItem>
                </Card>
              </TouchableOpacity>
            </View>
            <View style={styles.widthstyle}>
              <TouchableOpacity>
                <Card>
                  <CardItem>
                    <Body>
                      <View style={{ flexDirection: 'row' }}>
                        <Image
                          style={{ width: 30, height: 30 }}
                          source={require('../assets/abc.png')}
                        />
                        <Text style={{ textAlign: 'center' }}>Attended:50</Text>
                      </View>
                    </Body>
                  </CardItem>
                </Card>
              </TouchableOpacity>
            </View>
          </View>
        </View>
        {/* <Text style={{ textAlign: "center" }}>
            Swipe from left to right for menu
          </Text> */}
        <View style={{ marginBottom: 2 }}>
          <Text style={{ textAlign: 'center', fontSize: 20, marginBottom: 5 }}>
            Search
          </Text>
        </View>
        <Form style={{ marginLeft: 20 }}>
          <View style={{ flexDirection: 'row' }}>
            <Item style={{ paddingLeft: 20, width: '40%' }}>
              <Label style={{ textAlign: 'left' }}>Division</Label>
              <Input />
            </Item>
            <Item style={{ paddingLeft: 20, width: '40%' }}>
              <Label style={{ textAlign: 'left' }}>Area</Label>
              <Input />
            </Item>
          </View>
          <View style={{ flexDirection: 'row', paddingTop: 20 }}>
            <Item style={{ paddingLeft: 20, width: '40%' }}>
              <Label style={{ textAlign: 'left' }}>Gang</Label>
              <Input />
            </Item>
            <Item
              style={{
                borderBottomColor: 'white',
              }}
            >
              <Button info style={{ marginLeft: 25 }}>
                <Text> Search </Text>
              </Button>
            </Item>
          </View>
        </Form>

        {/*<View style={{ flex: 1, marginTop: 3, left: 0, right: 0, bottom: 0 }}>
            <MapView
              initialRegion={{
                latitude: 12.93092,
                longitude: 77.602156,
                latitudeDelta: 0.0922,
                longitudeDelta: 0.0421,
              }}
              style={styles.mapStyle}
            ></MapView>
          </View>
         */}
      </SafeAreaView>
    );
  }
}
const styles = StyleSheet.create({
  basic1Style: {
    // flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
    flexDirection: 'row',
  },
  widthstyle: {
    width: Dimensions.get('window').width / 2,
  },
  mapStyle: {
    position: 'absolute',
    top: 3,
    left: 0,
    right: 0,
    bottom: 0,
  },
});

export default InitialDb;
  

** Приведенный выше код работает синхронно, а также последовательно. Я хочу, чтобы это было в асинхронном режиме и ожидало, потому что это замораживает пользовательский интерфейс. А также он должен обновить все 2 объекта состояния после получения размера всех этих 2 коллекций firestore с использованием promise.all.
Здесь я обновил код, пожалуйста, проверьте его еще раз **

Ответ №1:

ПРОБЛЕМА

Проблема здесь в основном в том, что ваша firebase инициализируется при каждой hot-module перезагрузке. Вам нужно инициализировать только один раз для каждого приложения.

Таким образом, в принципе, вы могли бы обернуть инициализацию firebase с помощью try-catch и проглотить ошибку.

 try {
  firebase.initializeApp({
    /** config here **/
  });
} catch(err) {
  console.log(err);
}
  

Комментарии:

1. Уважаемый сэр, но мне нужен размер этих коллекций, как я объяснил в своей функции

2. Это то, что это такое, не так ли? Вы пробовали приведенный выше код?

3. Я получил размер, сэр, но он все еще замораживает пользовательский интерфейс

4. Не могли бы вы опубликовать весь свой код компонента? Это должно сработать. Кажется, что вы рендерите бесконечно.

5. Для меня выглядит хорошо. Можете ли вы создать закуску здесь ? Асинхронные функции не блокируют пользовательский интерфейс. Я не думаю, что есть проблема с вашим asynchronous function .