angularjs - 使用 Angular 1 应用程序管理 Typescript 中的 ES6/2015 Promise

标签 angularjs typescript angular-promise es6-promise

我们有一个使用 Typescript 构建的 Angular 1.5 应用程序,我正在尝试找出处理 ng.IPromise 与 Promise(ES6 promise )的最佳方法。我的偏好是只处理 ES6 Promise 类型。是否有一种优雅的方法来覆盖所有 angular-js 和 angular-material(也包括)接口(interface)以使用 es6 promises?

我能想到的选项:

  1. 使用一些 d.ts 魔法来做到这一点(可以做到吗?)
  2. 在任何地方转换为 ES6 Promise(有效,但不直观)
  3. 为开源做出贡献, fork ng 和 ng Material 的类型,并使它们返回 ES6 Promise 的类型(我可能应该这样做,但不确定我现在是否有时间钻空子)

澄清

angular 应用程序使用的底层 Promise 实现仍然是 $q(不过,我也在应用 angular-bluebird-promises)。我只是想简化/合并所涉及的 Typescript 接口(interface)。

最佳答案

它们应该保留两个不同的界面是有充分理由的。

$q promises 和其他实现之间存在根本区别。 $q 链可以同步并在摘要上运行。这不适用于其他 promise (即原生 Promise)。

在原生和$q promises共存的TS/ES6应用中,Promiseng.IPromise接口(interface)可以聚合为共同点适合他们两个,例如IPromise(没有 ng)。但这没有什么意义。在一段期望 $q promise(反之亦然)的代码中意外使用 native promise 是你最不想做的事情,但如果常见 Typescript 不会阻止它正在使用 IPromise

如果期望从 Angular 导出并由非 Angular 代码使用,最好将其转换为 Promise,如其他答案所建议的那样。

对于给定的非 Angular 上下文

let exportedPromise = getResolvedPromise();
...
exportedPromise.then(...);

这个

function getResolvedPromise() {
  return Promise.resolve($q.resolve());
};

将在下一个滴答时触发 then 回调。还有这个

function getResolvedPromise() {
  return $q.resolve();
};

将暂停链直到下一个根作用域摘要,即使 then 已被链接到 resolved promise。

虽然与 TS 无关,this question是一个很好的例子,为什么始终注意使用的是 $q 还是原生 promise 是很重要的。

关于angularjs - 使用 Angular 1 应用程序管理 Typescript 中的 ES6/2015 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38122992/

相关文章:

javascript - 如何使用d3滚动整个页面

angular - 将枚举与方法合并

angularjs - 在 Angularjs 中使用另一个 $http 中的一个 $http 的响应

javascript - forEach 中的 promise 返回

javascript - 使用 AngularJS 按字母顺序对用户输入进行排序

javascript - ngSatellizer 和 Hapi/Bell 不能很好地协同工作。 Promise 不会解决 Twitter

javascript - 如何使用 ngIf 将输入的焦点放在表单字段中

javascript - 如何将 Ng-if 与 Firebase 结合使用

javascript - Angular 1- Angular .js :11655 RangeError: Maximum call stack size exceeded

javascript - 如何在 Nextjs 中处理创建/编辑页面,我应该在 ServerSideProps 中还是在组件中获取产品