使用Angular 1 App管理Typescript中的ES6 / 2015承诺

时间:2016-06-30 12:23:23

标签: angularjs typescript angular-promise es6-promise

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

我能想到的选项:

  1. 使用一些d.ts魔法来做到这一点(可以吗?)
  2. 在任何地方投射到ES6承诺(有效,但不直观)
  3. 贡献开源,分叉ng和ng材料的类型,并让它们返回ES6 Promise的类型(我可能应该这样做,但不确定我现在有时间挖兔子洞)
  4. 澄清

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

2 个答案:

答案 0 :(得分:2)

  

是否有一种优雅的方式来覆盖所有angular-js和angular-material(也包括在内)接口以使用es6 promises

我们到处都是IPromise。由于潜在的实施差异,很难用IPromise替换Promise。如果你愿意,你最好不要做Promise.resolve(someIPromise)但是它不会用角度来玩。

答案 1 :(得分:2)

有很好的理由说明为什么它们应该保留两个不同的接口。

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

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

如果希望从Angular导出promise并由非Angular代码使用,则最好将其转换为Promise,如另一个答案所示。

对于给定的非角度上下文

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

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

将在下一个tick上触发then回调。这个

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

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

虽然与TS无关,但this question是一个很好的例子,为什么始终要知道它是$q还是使用本机保证是很重要的。