Promise返回undefined AsyncStorage

时间:2016-09-03 09:41:38

标签: javascript reactjs react-native asyncstorage

我有一个本机应用程序,我会进行一些身份验证。

我有以下代码,我检查令牌是否未过期且可用。

export const isLogged = () => {

  AsyncStorage.getItem('@token')
    .then( token => {

      if (typeof token !== 'undefined') {

        if (tokenExpired(token)) {

          return false

        }

        return true

      }

      return false

    } )
    .catch( error => {

      return false

    } )

}

但是在我的代码中,如果我这样做:

let isUserLogged = isLogged()
console.log(isUserLogged) // -> returns undefined, but should return true because the token is there and its not expired.

有没有人知道为什么会这样,我做错了什么?

2 个答案:

答案 0 :(得分:4)

您正在尝试同步获取仅异步可用的结果。

更改您的代码:

  1. 在此次通话前添加return

    AsyncStorage.getItem('@token')
    

    这将使您的isLogged函数返回一些内容:一个承诺

  2. 在主代码中使用此承诺:

    isLogged().then( isUserLogged => { 
        console.log(isUserLogged);
    });
    
  3. 你的函数isLogged返回一个promise(当你返回它时)就是chaining的一个例子。

答案 1 :(得分:1)

您的isLogged函数是一个异步函数,即 - 它在函数执行的确切时刻可能无法使用的值上运行,但在时间上延迟。

由于您已在此处运行Promises,因此您只需返回AsyncStorage承诺链的结果,然后在调用isLogged()函数时附加其他处理程序:

// inside your isLogged() function
return AsyncStorage.getItem('@token')
  .then(...)
  ... rest of your code unchanged ...

// when invoking isLogged()
isLogged().then((isLogged) => {
    console.log("is user logged: ", isLogged);
});

您还应该阅读有关JavaScript中Promises的更多信息。