$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
我正在创建一些与我想手动解决的承诺一起工作的单元测试,我发现我的承诺延续似乎永远不会被击中。所以我在 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