【发布时间】:2020-02-20 02:47:46
【问题描述】:
我正在使用 Nativescript-Vue 构建一个应用程序,该应用程序需要对用户进行身份验证才能使用该应用程序。我有一个 RESTful 后端,其功能与 Postman 的测试一致。
JWT 令牌具有永久生命,但需要每 5 分钟刷新一次(刷新功能 - 在真空中 - 正常工作)。
使用 Axios.js 进行网络调用。
我被困在如何实现确定用户是否登录的基本逻辑。所有 Axios 调用都返回一个 Promise。我已经阅读了很多扩展的“承诺”回复,但我并没有想到如何做我想做的事。简而言之,我需要暂停代码执行,直到 API 可以对用户进行身份验证,而这不是为我计算的。
代码如下:
app.js
// Import VUE library
import Vue from "nativescript-vue";
// This is my user handler
import {UserServices} from "./assets/js/UserServices.js"
// imported Components
import Login from "./components/Login";
import Home from "./components/Home.vue"
let user = new UserServices();
let loggedIn = user.checkAuthStatus();
new Vue({
render: h => h('Frame', [
h(
loggedIn ? Home : Login
)
])
}).$start();
这不起作用,因为 user.checkAuthStatus() 是一个返回承诺的异步函数,因此我无法返回布尔值。我知道这是问题所在,但我将其留在了代码中,以便可以理解预期的结果。我不明白的是如何重写代码,以便使用 Promises 使设计的流程可行。
核心逻辑设计为:
通过 user.checkAuthStatus() 检查用户的登录状态。此例程检查有效令牌(有效意味着它存在且未过期)。如果已过期,则通过从 UserServices 控制器调用 this.refresh() 来刷新令牌。
-
如果从 user.checkAuthStatus() 返回值“true”,则 Vue 应用应加载 Home 组件(即用户已登录),否则应要求用户登录。
我只能想象这是成千上万人成功克服的简单情况,但我的大脑无法通过它。我明白为什么 JS 需要继续运行以免停止代码的进度(这就是 Promise 的重点,我认为?),但有时代码只需要停止并等待它,就像在用户身份验证中一样场景。
对如何解决我的挑战的具体细节有帮助吗?请,谢谢。
【问题讨论】:
-
不幸的是,您不能等到 API 完成后再启动您的应用程序。如果存储了有效令牌,大多数应用程序会加载主页,加载主页后可能会异步验证令牌,如果发现令牌无效,用户将退出应用程序。或者,您可以使用加载屏幕启动应用程序,在验证登录后导航到相应页面。
-
@Manoj - 谢谢。我认为“加载”屏幕方法是有道理的,我没有想到。所以使用我的成功/失败回调在必要时重定向,知道等待页面将被显示,直到承诺解决。
标签: authentication promise axios nativescript