-3

我有一个 react-native 应用程序,我在其中进行一些身份验证。

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

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.

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

4

2 回答 2

4

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

像这样更改您的代码:

  1. return在此调用之前添加:

    AsyncStorage.getItem('@token')
    

    这将使你的isLogged函数返回一些东西:一个承诺

  2. 在你的主代码中使用这个承诺:

    isLogged().then( isUserLogged => { 
        console.log(isUserLogged);
    });
    

您的函数isLogged返回一个承诺(即当您返回它时)这一事实是链接的一个示例。

于 2016-09-03T09:52:37.757 回答
1

您的isLogged函数是一个异步函数,也就是说 - 它对在函数执行的确切时刻您可能不可用但时间延迟的值进行操作。

由于您已经在这里操作 Promises,您可以只返回您的AsyncStoragePromise 链的结果,然后在调用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的内容。

于 2016-09-03T09:52:26.357 回答