首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncStorage行为

AsyncStorage行为
EN

Stack Overflow用户
提问于 2018-05-03 07:56:55
回答 2查看 625关注 0票数 0

我偶然发现了AsyncStorage的一种奇怪的行为,我无法把头绕在头上,我会感激任何人能向我解释幕后发生了什么(即失败的案例和原因)。

下面是我正在研究的代码:

代码语言:javascript
复制
componentDidMount() {
        let _this = this;

        AsyncStorage.getItem('token', (err, data) => {
            setTimeout(() => {
                if(data !== null){
                    this.setState({isReady: true, isLoggedIn: true});
                    store.dispatch({type: t.LOGGED_IN, token: data});
                }
                else{
                    this.setState({isReady: true, isLoggedIn: false})
                    store.dispatch({type: t.LOGGED_OUT});
                }
            }, 3000)
            console.log(err);
        });
    }

正如您所看到的,我正在按照文档将一个callback函数传递给getItem(),这基本上告诉我用户以前是否登录过并且此后还没有注销(也就是说,令牌仍然在设备/应用程序中的某个位置)。这段代码第一次成功,检索了我通过减法器存储的旧令牌:

代码语言:javascript
复制
export default function authReducer(state = initialState, action)
{
    switch (action.type) {
        case t.LOGGED_IN:{
            AsyncStorage.setItem('token', action.token);
            return Object.assign({}, state, { isLoggedIn: true, token: action.token });
        }
        case t.LOGGED_OUT:{
            AsyncStorage.removeItem('token');
            return Object.assign({}, state, {isLoggedIn: false, token: null});
        }
        default:
            return state;
    }
}

然而,在我第二次重新加载应用程序时,即使我一次又一次地尝试登录,AsyncStorage也总是无法检索数据。

我也尝试了AsyncStorage调用的变体,即使用await.then.catch,但是它们都导致了相同的结果。

我的问题是:

  1. 在失败的情况下,我的印象是getItem()仍然会调用我传递的回调函数,因为param列表上有一个error。但是,在上述情况下,我的console.log从未运行过。我在等什么不该在这里的事吗?
  2. 为什么它只会从第二次失败?是否存在这样的情况:在同一密钥上多次调用setItem()而不删除它将导致存储失败?(我确信第一次尝试是成功的,因为我从异步存储中打印了检索到的令牌)
  3. 这与我从世博会加载应用程序并用CRNA初始化应用程序有什么关系吗?这会使asyncStorage的持久性质量有所不同吗?

谢谢!)

编辑:经过进一步的检查,似乎停止了打包程序并再次运行它似乎允许应用程序再次成功地检索旧令牌,但是如果我再次刷新应用程序,在编辑代码之后,getItem()将再次失败。这是一个世博和持久存储的东西吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-04 06:31:30

还原剂必须不受副作用的影响,因为它是一个纯函数.

正如文档中提到的

它们必须是纯函数-functions,它对给定的输入返回完全相同的输出。它们也应该是无副作用的

副作用-当过程从其作用域外更改变量时

一个更好的方法是使用雷德克斯-传奇,这就像一个单独的线程为您的副作用模型。

票数 0
EN

Stack Overflow用户

发布于 2018-05-04 02:09:13

所以这个问题现在已经解决了,多亏了我的一个更有经验的程序员朋友。结果我的错误是我把AsyncStorage.setItem()调用放进了减速机,他说它本质上是deterministic。在调度之前,我将调用转移到该类的actions.js,它可以工作!

所以而不是

代码语言:javascript
复制
export default function authReducer(state = initialState, action)
{
    switch (action.type) {
        case t.LOGGED_IN:{
            AsyncStorage.setItem('token', action.token);
            return Object.assign({}, state, { isLoggedIn: true, token: action.token });
        }
        case t.LOGGED_OUT:{
            AsyncStorage.removeItem('token');
            return Object.assign({}, state, {isLoggedIn: false, token: null});
        }
        default:
            return state;
    }
}

我做到了

代码语言:javascript
复制
export default function authReducer(state = initialState, action)
{
    switch (action.type) {
        case t.LOGGED_IN:{
            return Object.assign({}, state, { isLoggedIn: true, token: action.token });
        }
        case t.LOGGED_OUT:{
            return Object.assign({}, state, {isLoggedIn: false, token: null});
        }
        default:
            return state;
    }
}

再加上这个

代码语言:javascript
复制
export function login(data, successCB, errorCB) {
    return (dispatch) => {
        api.login(data, function (success, data, error) {
            if (success && data.exists) {
                AsyncStorage.setItem('token', data.token); //NOTE THIS
                dispatch({type: t.LOGGED_IN, token: data.token});
                successCB(data);
            }else if (error) errorCB(error)
        });
    };
}

export function signOut(successCB, errorCB){
  return (dispatch) => {
    AsyncStorage.removeItem('token'); //NOTE THIS
    dispatch({type: t.LOGGED_OUT});
    successCB();
  }
}

但我的问题仍然是persists (请原谅双关语),“为什么这个简单的修改有效?我是否理解reducersdispatchers的错误机制?”

另外,deterministic意味着什么,与Async调用的不兼容有什么关系?

如果有人能向我解释这个概念,那就太棒了!:D

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50149783

复制
相关文章

相似问题

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