3

我正在使用 angular.js 和 ngstore。我正在使用基于令牌的身份验证和 node.js REST 服务,从 Angular 应用程序我将凭据发送到 REST 服务器并接收令牌,然后将此令牌存储在 $localStorage 中以在所有 Angular 应用程序中使用($ localStorage.token)。但事实证明,有时 $localStorage.token 是未定义的,即使我将令牌分配给它,所以当我调用另一个在标头中发送令牌的休息端点时,我实际上是在发送一个未定义的值。另外,当我尝试注销时,我会这样做

delete $localStorage.token

但是当我检查用户是否已注销时,实际上令牌仍然存在。奇怪的是,如果我在删除令牌或分配令牌后立即设置断点并等待一段时间,一切正常,这让我认为这些操作可能是异步的?

这是个常见的问题吗?我该如何解决这个问题?

任何帮助将不胜感激,谢谢。

编辑:实际上我发现问题出在使用 window.location 时,如果我使用 $location.path 它可以工作,但由于某些原因我需要使用 window.location,据我所知它应该可以工作

4

2 回答 2

5

我今天遇到了同样的问题,使用以下提交对我有用。

https://github.com/raynode/ngStorage

这里有一个关于这个问题的有用讨论:

https://github.com/gsklee/ngStorage/issues/39

在这个版本的 ngStorage 中,作者精心提供了一种在继续执行 $window.location.reload(); 之前“保存”的方法;

登录期间:

$localStorage.value = 100;
$localStorage.$save();

(然后)$window.location.reload();

注销期间:

delete $localStorage.value;
$localStorage.$save();
$window.location.reload();

这对我来说可以确保在重新加载页面之前删除 $localStorage 变量。

于 2015-02-23T01:40:26.483 回答
1

不,本地存储不是异步的。

JavaScript 是单线程环境,对本地存储的读/写操作会立即发生。

会话和本地存储容器都是相同的。除了会话存储是一个指定了过期时间戳的键/值对。

HTML5 中的存储不是可靠的资源。因为有许多浏览器状态会限制或删除存储。

您指的ngStore是我从未听说过的模块。默认情况下,AngularJS 不包含本地存储模块,并且有多个开源模块可以处理这个问题。

最有可能发生的是您将会话令牌作为状态变量而不是状态承诺来处理。当您使用变量来保存服务器上资源的状态时,该状态有 3 个可能的值。1 个未分配,2 个待分配,3 个已分配值。

而不是直接从存储中读取令牌。您应该有一个服务,该服务返回一个承诺,该承诺将解决提供该令牌。此承诺仅在 REST 操作完成后才会解决。

于 2015-02-22T17:43:19.200 回答