虽然document.cookie包含值,但$ cookies.get()给出了undefined

时间:2017-10-24 10:53:29

标签: javascript angularjs cookies safari mobile-safari

在以下代码中,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()代码中找不到任何暗示这一点的内容。

有没有人遇到过这个问题?

1 个答案:

答案 0 :(得分:0)

到目前为止,我已经通过在超时中包装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之类的钩子只会在摘要周期结束后才会运行,但这次调用是深入的几次服务调用,我不明白这是怎么回事。