1

Peter Kniestedt提出的一个(现在已删除)问题中,他想知道在哪里以及如何设置计时器来检查用户的身份验证。

他的问题是一个更大问题的一部分(这是这个问题的标题)。因为我认为回答这个问题很重要,所以我创建了一个新问题,以便在一个地方收集所有重要信息。

4

1 回答 1

1

这是使用状态图的典型案例,更具体地说是并发状态。

如果您还不知道,SproutCore 包含一个名为 SC.Statechart 的非常有用的库,它是一种处理应用程序状态的方法,比使用布尔属性更可控,因为它也像一个响应者和控制器。

在这种情况下,您需要一个在根中具有两种并发状态的状态图:一种用于处理围绕身份验证的状态,另一种用于处理应用程序的其余部分。

MyApp.statechart = SC.Statechart.create({
  rootState: SC.State.design({
    substatesAreConcurrent: true,
    AUTH: SC.State.design({
      initialSubstate: 'CHECKAUTH',
      CHECKAUTH: SC.State.design({
      }),
      LOGIN: SC.State.design({
      }),
      AUTHENTICATING: SC.State.design({
      }),
      AUTHENTICATED: SC.State.design({
      }),      
    }),
    APPMAIN: SC.State.design({
    })
  })
});

这应该如何工作:当您的应用程序启动时,它将同时进入两种状态,一种是 APPMAIN 状态,它是处理应用程序本身的状态。另一个是 AUTH 状态,它会立即进入初始子状态 CHECKAUTH,它检查用户是否有一个有效的会话。如果没有,这个状态应该进入 LOGIN 状态,它负责显示一个登录屏幕。当用户随后执行登录时,LOGIN 状态转换为 AUTHENTICATING 状态,由服务器检查。如果此尝试无效或不正确,则 AUTHENTICATING 状态应转换为 LOGIN,否则转换为 AUTHENTICATED。

要回答最初的问题,这个问题是基于:如果您需要一个计时器来定期检查身份验证是否仍然有效,它应该处于 AUTHENTICATED 状态。如果失败,您可以立即转换到 LOGIN 状态,以显示登录屏幕。

使用这样的状态图可以防止用户必须重新加载或退出应用程序才能再次登录,并可能因此丢失数据。简而言之,它可以提供更好的用户体验。

于 2015-05-12T10:10:33.430 回答