React Native AsyncStorage возвращает обещание, даже если используется await и async

Я исследовал проблему в AsyncStorage.getItem. Во многих комментариях говорилось, что мы должны применять await и anync к AsyncStorage, например

стоимости.

AsyncStorage.getItem, возвращающее обещание

Тем не менее, он по-прежнему возвращает мне обещание, как показано на снимке ниже. В этом обещании _55 содержала правильную информацию о пользователе. Сможет ли каждый помочь мне разобраться в проблеме и дать возможное решение? Благодарю вас!

Снимок: Снимок отладчика

Редуктор:

import {AsyncStorage} from "react-native";
import {LOGIN, LOGOUT, UPDATE} from './../actions/authActions'
import user from "./index";

export type State = {
    user: Object,
    login: boolean,
}

getUser = async (string) => {  //Get user information form AsyncStorage
    try {
         return await AsyncStorage.getItem(string)
                  .then((user) => {
                     if (user !== null) {
                        return JSON.parse(user);
                     } else {
                        return null;
                   }
                });
    } catch (error) {
        return null;
    }
};

const initialState = {
    info: getUser(),
    login: !!this.info, // if not null, login = ture
};

function loginReducer(state: State = initialState, action) {
    switch (action.type) {
        case LOGIN:
            return {
                info: action.payload,
                login: true,
            };
        case LOGOUT:
            return {
                info: null,
                login: false,
            };
        case UPDATE:
            return {...state, info: Object.assign(state.info, action.payload)};
        default:
            return state;
    }
}   

Действие:

import {AsyncStorage} from "react-native";
import {requestLogIn, requestLogOut} from "../../config/api/authApi"

export const LOGIN = "LOGIN";
export const LOGOUT = "LOGOUT";
export const UPDATE = "UPDATE";
export const ERROR = "ERROR";

export function login(user) {
    return dispatch => {
        return AsyncStorage.setItem("user", JSON.stringify(user)) //Store user information in AsyncStorage
            .then(() => {
                dispatch({
                    type: LOGIN,
                    payload: user
                })
            }).catch((error) => {
                console.warn("Error: ", error);
                dispatch({
                    type: ERROR,
                    payload: null
                })
            });
    }
}

export function logout(token) { //
    return dispatch => {
        return requestLogOut(token).then((status) => {
            if (status) {
                return AsyncStorage.removeItem("user")
                    .then(() => {
                        dispatch({
                            type: LOGOUT,
                        })
                    }).catch(() => {
                        dispatch({
                            type: ERROR,
                            payload: null
                        });
                    });
            } else {
                dispatch({
                    type: ERROR,
                    payload: null
                });
            }
        })

    }
} ..// other actions

person Chris Yeung    schedule 18.05.2018    source источник


Ответы (1)


Ваша getUser - это async функция, но вы не await ее выполняете:

const initialState = {
    info: getUser(),      // <=== here
    login: !!this.info,
};

async функции возвращают обещания.

Не вдаваясь в более широкий контекст кода, вы, вероятно, захотите сделать что-то вроде этого:

const initialState = {
    info: null,
    login: !!this.info,
};
getUser().then(info => initialState.info = info);

Или что-то вдоль этих линий. Обратите внимание, что это означает, что initialState.info будет null, пока хранилище не вернет значение. Если у вас есть дополнительная инициализация, для которой требуется это значение, вам придется запускать его из обработчика then выше.

(Нет catch на это, потому что вы определили getUser, что он не может отклонить.)

person T.J. Crowder    schedule 18.05.2018