ngStorage 是否异步执行操作?

Does ngStorage perform operations asynchronously?

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

delete $localStorage.token

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

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

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

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

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

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

会话和本地存储容器都是一样的。除了会话存储是一个 key/value 对,并指定了过期时间戳。

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

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

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

而不是直接从存储中读取令牌。您应该拥有一项服务,该服务 returns 将解决提供该令牌的承诺。此承诺只会在 REST 操作完成后生效。

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

https://github.com/raynode/ngStorage

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

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

在此版本的 ngStorage 中,作者在继续执行 $window.location.reload();

之前精心提供了 "save" 的方法

登录期间:

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

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

注销期间:

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

这对我有用,可确保在页面重新加载之前删除 $localStorage 变量。