javascript - $q 推迟在 Jasmine 中不触发延续

标签 javascript angularjs jasmine angular-promise

我正在创建一些与 promise 一起使用的单元测试,我想手动解决这些 promise ,但发现我的 promise 延续似乎永远不会被击中。因此,我在 jasmine 调试面板中打开控制台,在窗口对象上放置对 $q 的引用...并且

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

没有记录任何内容...

$q seems to never trigger continuations

这是怎么回事?! $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/

相关文章:

javascript - 如何从多个元素中选择一个元素克隆到单独的部分? (对其进行硬编码,以节省时间和资源)

html - 使用 Angular 提交表单时更改类并显示消息

javascript - 如何检查文件是否存在于带 Angular url中?

javascript - Angular 1 : Change title depending on current route

javascript - 我怎样才能像这样为 Angular Controller 和服务编写 Jasmine 测试?

angular - Jasmine Angular 测试有时通过有时不通过,具体取决于 Describe 前缀

javascript - Jasmine 期望不使用 requirejs

javascript - 如何将 JavaScript 变量值传递给 python 变量(flask)

javascript - d3.js - 使用 Canvas 保持交互

javascript - 如何通过 api 获取数据并用它渲染子组件 - react 谷歌地图