$q 延迟不触发 Jasmine 中的延续

$q deferred not firing continuations in Jasmine

我正在创建一些与我想手动解决的承诺一起工作的单元测试,我发现我的承诺延续似乎永远不会被击中。所以我在 jasmine 调试面板中打开控制台,在 window 对象上引用 $q...和 ​​

d = $q.defer()
d.promise.then(x => console.log(`done`, x))
d.resolve(5)

没有任何记录...

这是怎么回事?! $q 现在能正常工作了吗?难道它不像世界上所有其他延迟实施一样有效吗?我读错了他们的 (insanely meager) 文件吗?怎么可能上面的promise被resolved却没有续火?!

AngularJs 1.5.8

本例中的日志 "done 5"

angular.module("app",[])
.run(function($q) {
   var d = $q.defer();
   d.promise.then(x => console.log(`done`, x));
   d.resolve(5);
});
<script src="//unpkg.com/angular/angular.js"></script>
  <body ng-app="app">
    <h1>Promise example</h1>
  </body>


与浏览器事件循环集成

AngularJS 通过提供自己的事件处理循环来修改正常的 JavaScript 流程。这将 JavaScript 分为经典和 AngularJS 执行上下文。使用 $apply() 从 JavaScript 进入 AngularJS 执行上下文。请记住,在大多数地方(控制器、服务)$apply 已经被处理事件的指令调用。

ES6 承诺由 JavaScript 事件循环处理。 $q 承诺由 AngularJS 事件循环处理。只有在 AngularJS 执行上下文中应用的操作才能受益于 AngularJS 数据绑定、异常处理、属性 监视等

在 Jasmine 测试的情况下,使用 $rootScope.$apply() 进入 AngularJS 执行上下文。

有关详细信息,请参阅 AngularJS Developer Guide - Integration with the browser event loop