使用 Angular 1 个应用管理 Typescript 中的 ES6/2015 Promise

Managing ES6/2015 Promises in Typescript with an Angular 1 App

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

我能想到的选项:

  1. 使用一些d.ts魔法来做到这一点(能做到吗?)
  2. 转换为 ES6 Promise 无处不在(有效,但不直观)
  3. 为开源做出贡献,分叉 ng 和 ng material 的类型,并使它们成为 return 类型的 ES6 Promise(我可能应该这样做,但不确定我是否有时间现在是一个兔子洞)

澄清

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

Is there an elegant way to override all angular-js and angular-material (also included) interfaces to use es6 promises

我们到处都是IPromise。由于底层实现差异,很难将 IPromise 替换为 Promise。如果你愿意,你最好做 Promise.resolve(someIPromise),但那样就不会玩 angular。

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

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

在本机和 $q 承诺共存的 TS/ES6 应用程序中,Promiseng.IPromise 接口可以聚合到适合它们的公分母,例如IPromise(没有 ng)。但这没有什么意义。在一段期望 $q promise(反之亦然)的代码中意外使用本机 promise 是你最不想做的事情,但如果 common IPromise 正在使用,Typescript 不会阻止它用过。

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

对于给定的非Angular上下文

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

这个

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

将在下一个价格变动时触发 then 回调。还有这个

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

将暂停链直到下一个根作用域摘要,即使 then 已被链接到已解决的承诺。

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