我们有一个使用Typescript构建的Angular 1.5应用程序,我试图找出处理ng.IPromise vs Promise(ES6 promise)的最佳方法。我的偏好只是处理ES6 Promise类型。是否有一种优雅的方法来覆盖所有angular-js和angular-material(也包括在内)接口以使用es6 promises?
我能想到的选项:
澄清
angular应用程序使用的底层Promise实现仍然是$ q(但是,我也应用了angular-bluebird-promises)。我只是想简化/合并涉及的Typescript接口。
答案 0 :(得分:2)
是否有一种优雅的方式来覆盖所有angular-js和angular-material(也包括在内)接口以使用es6 promises
我们到处都是IPromise
。由于潜在的实施差异,很难用IPromise
替换Promise
。如果你愿意,你最好不要做Promise.resolve(someIPromise)
但是它不会用角度来玩。
答案 1 :(得分:2)
有很好的理由说明为什么它们应该保留两个不同的接口。
$q
承诺与其他实施之间存在根本区别。 $q
链可以是同步的,并在摘要上运行。这不适用于其他承诺(即本地Promise
)。
在本地和$q
承诺共存的TS / ES6应用程序中,Promise
和ng.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
还是使用本机保证是很重要的。