React Native AsyncStorage возвращает обещание даже при использовании await и async - PullRequest
0 голосов
/ 18 мая 2018

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

React Native AsyncStorage возвращает обещание вместо значения .

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

Тем не менее, он по-прежнему возвращает Promise мне, как на снимке ниже.Внутри этого Обещания _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

1 Ответ

0 голосов
/ 18 мая 2018

Ваша 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 так, что он не можетотклонять.)

...