$cookies.get() 给出 undefined 尽管 document.cookie 包含值

$cookies.get() gives undefined although document.cookie contains the value

在下面的代码中,xsrfCookie 有时 未定义。我测量了大约 20% 的调用。

这似乎只发生在 MacOS Safari 和 iOS Safari en Chrome 中。我正在使用 Angular 1.5.6.

$http.get('some_url')
  .success(function() {
    var xsrfCookie = $cookies.get('XSRF-TOKEN');
  });

在 xsrfCookie 之前或之后设置断点并记录 document.cookie 甚至 $cookies.get('XSRF-TOKEN') 始终显示预期的 XSRF 令牌。

我只能想象这与异步设置 GET 的 XSRF 令牌有关,与成功函数并行,但我在 angular.get() 代码中找不到任何建议这个。

有人 运行 了解这个问题吗?

到目前为止,我已经通过在超时中包装 cookie 的检索解决了这个问题:

$http.get('some_url')
  .success(function() {
    $timeout(function() {
      var xsrfCookie = $cookies.get('XSRF-TOKEN');
    }, 1);
  });

不幸的是,我一直无法找到为什么需要这样做(预计它可能与 AngularJS 1.5 摘要周期有关)但我确实发现了其他一些事情:

  • 原来的问题只出现在 iOS 和 MacOS 上的 Safari 中,而且只是偶尔出现。取决于环境(内联网、互联网),但每天都在变化,我有时会遇到 100% 的失败率,有时会低至 10%。
  • 如果我将 document.cookie 记录为成功回调中的第一件事,它也是空的(再次仅在 Safari 中且仅有时)
  • 可能 $timeout 仅在摘要完成后触发,即使 $timeout 没有毫秒参数也可以工作
  • onInit 这样的挂钩只会在摘要循环完成后 运行,但是这个调用是几个服务调用的深度,我不明白这是怎么回事。