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

Ken*_*Ken 4 angularjs typescript es6-promise angular-promise

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

我能想到的选项:

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

澄清

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

Est*_*ask 6

有充分的理由解释为什么它们应该保留两个不同的接口。

承诺和其他实现之间存在根本区别$q$q链可以是同步的并且在摘要上运行。这不适用于其他承诺(即 native Promise)。

在 TS/ES6 应用程序中,本机和$qPromise 共存,Promise并且ng.IPromise接口可以聚合到适合它们两者的公分母,例如IPromise(没有ng)。但这没有什么意义。在一段需要 Promise 的代码中意外使用 Native Promise $q(反之亦然)是您最不想做的事情,但如果IPromise使用 Common,Typescript 不会阻止这种情况。

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

对于给定的非 Angular 上下文

let exportedPromise = getResolvedPromise();
...
exportedPromise.then(...);
Run Code Online (Sandbox Code Playgroud)

function getResolvedPromise() {
  return Promise.resolve($q.resolve());
};
Run Code Online (Sandbox Code Playgroud)

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

function getResolvedPromise() {
  return $q.resolve();
};
Run Code Online (Sandbox Code Playgroud)

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

虽然与 TS 无关,但这个问题是一个很好的例子,说明为什么始终了解它是$q使用的 Promise 还是本机 Promise 很重要。