我正在创建一些与 promise 一起使用的单元测试,我想手动解决这些 promise ,但发现我的 promise 延续似乎永远不会被击中。因此,我在 jasmine 调试面板中打开控制台,在窗口对象上放置对 $q
的引用...并且
d = $q.defer()
d.promise.then(x => console.log(`done`, x))
d.resolve(5)
没有记录任何内容...
这是怎么回事?! $q
现在可以正常工作了吗?它不是像世界上其他所有延迟实现一样工作吗?我读他们的( insanely meager )文档是否错误?怎么可能上面的promise得到了解决却没有继续执行呢?!
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 执行上下文。请记住,在大多数地方( Controller 、服务),处理事件的指令已经为您调用了$apply
。
ES6 Promise 由 JavaScript 事件循环处理。 $q promise 由 AngularJS 事件循环处理。只有在 AngularJS 执行上下文中应用的操作才会受益于 AngularJS 数据绑定(bind)、异常处理、属性监视等。
对于 Jasmine 测试,使用 $rootScope.$apply()
进入 AngularJS 执行上下文。
有关详细信息,请参阅AngularJS Developer Guide - Integration with the browser event loop
关于javascript - $q 推迟在 Jasmine 中不触发延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45777899/