首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在componentDidMount函数中调用异步函数?

如何在componentDidMount函数中调用异步函数?
EN

Stack Overflow用户
提问于 2019-06-26 04:57:49
回答 2查看 939关注 0票数 0

我正在尝试从API中获取一些数据并将其放入flatList中。flatList中的每一行都有一个白色的星形按钮,当按下它时,会将此条目添加到保存在AsyncStorage中的收藏夹中。我想做的是获取保存在本地的密钥,并检查此项目是否在我想要显示黑星的收藏夹列表中。我无法填充状态中的收藏夹数组。

代码语言:javascript
复制
/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow
*/

import React, { Component } from 'react';
import {
    StyleSheet, Text, View, ActivityIndicator, AsyncStorage,
    Image, ToastAndroid, TouchableOpacity, FlatList
} from 'react-native';

export default class App extends Component {

    constructor(props) {
        super(props)
        this.state = {
            isLoadingData: true,
            dataSourceEmpty: null,
            favorites: null
        }
    }

    componentDidMount() {
        return fetch('http://barcelonaapi.marcpous.com/bicing/stations.json')
            .then((response) => response.json())
            .then((JsonResponse) => {

                this.setState({
                    isLoadingData: false,
                    dataSourceEmpty: JsonResponse.data.bici,
                    favorites: null
                })
            })
            .catch((error) => {
                console.log(error);
            });
    }

    _touchListener = (item) => {
        alert("ID is:" + item.id + "\n"
            + "Latitude is: " + item.lat + "\n"
            + "Longitude is:" + item.lon)
    };

    makeFavorite(item) {
        this.saveData(item);
        ToastAndroid.show(
            'This station has been added to favorites!',
            ToastAndroid.SHORT
        );
    }

    saveData(station) {
        AsyncStorage.setItem(station.id + "", station.name);
    }

    DATABASE_getAllBusStations = () => {
        return new Promise(async (resolve, reject) => {
            try {
                let keys = await AsyncStorage.getAllKeys();
                resolve(keys)
            } catch (error) {
                reject(new Error('Error getting keys from AsyncStorage: ' +
                    error.message))
            }
        });
    }

    checkifInDatabase = async () => {
        try {
            var keys = await this.DATABASE_getAllBusStations();
            this.setState({
                isLoadingData: true,
                dataSourceEmpty: null,
                favorites: keys
            })
        } catch (error) {
            console.log(error);
        }
    }

    render() {
        if (this.state.isLoadingData) {
            return (
                <View style={styles.container}>
                    <ActivityIndicator size="large" animating />
                </View>
            );
        }
        else {
            return (
                <View style={styles.container}>
                    <Text style={styles.header}>
                        BARCELONA BUS STATIONS
              </Text>
                    <FlatList
                        data={this.state.dataSourceEmpty}
                        renderItem={({ item }) => {
                            let source = './Assets/fav.png';
                            // if(this.state.favorites.includes(item.id))
                            // {
                            //   source = './Assets/favblack.png';
                            // }
                            return <TouchableOpacity style={styles.item}
                                onPress={() => this._touchListener(item)}>
                                <View style={styles.row}>
                                    <Text style={styles.textStyle}>
                                        {item.name}
                                    </Text>
                                    <View style={styles.buttonStyle}>
                                        <TouchableOpacity onPress=
                                            {() => this.makeFavorite(item)}>
                                            <Image
                                                source={require(source)}
                                                style={styles.imageStyle}
                                            />
                                        </TouchableOpacity>
                                    </View>
                                </View>
                            </TouchableOpacity>
                        }
                        }
                        keyExtractor={(item, index) => index.toString()}
                    />
                </View>
            );
        }
    }
}
const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#F5FCFF',
    },
    indicator: {
        alignItems: 'center',
        justifyContent: 'center',
    },
    row:
    {
        flexDirection: 'row',
        justifyContent: 'space-between'
    },
    item: {
        padding: 10,
        borderBottomWidth: 1,
        borderBottomColor: '#eee',
        backgroundColor: 'skyblue'
    },
    header:
    {
        backgroundColor: '#F03209',
        textAlign: 'center',
        padding: 10,
        color: 'skyblue',
        fontSize: 20
    },
    imageStyle:
    {
        width: 50,
        height: 50
    },
    textStyle:
    {
        padding: 10
    }
});
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56761900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档