【问题标题】:$q replacement for .when() and .finally()$q 替换 .when() 和 .finally()
【发布时间】:2019-05-12 14:32:17
【问题描述】:

我正在将 AngularJS 迁移到 Angular

试图用 Promise 替换 $q

我有

$q.when(btn.onClick()).finally(test => {
    // code
})

我已经用下面的代码替换了它,但不确定这是否是确切的替换。

Promise.resolve(btn.onClick()).then(test => {
    // code
})

来自$q.when() 我知道我们可以将.resolve() 用于.when()

但是 .finally() 的替代品是什么

【问题讨论】:

  • 为什么你需要 finally,你可以使用 .then 来达到同样的效果?
  • 我在我的代码中用 .resolve() 和 .finally() 替换了 .when() 和 .then(),我只是想知道这是否是正确的方法?

标签: angularjs angular


【解决方案1】:

//意识到这不是问题所在。我的错!

你可以使用

.then(function(){
})

根据我的了解,finally() 没有真正的替代品

【讨论】:

  • 感谢您的回答,但我需要将 $q 替换为 Promise 以将 AngularJS 迁移到 Angular
  • 意识到我完全错误地阅读了这个问题,请再次阅读该帖子,看看是否有帮助?
  • 是的,应该可以正常工作,DATA.resolve().then(function())。你也可以尝试使用 $q.defer(Data).then(function)
【解决方案2】:

首先将组件模板按钮单击绑定到您的模板逻辑

<button (click)="onClick()">Click</button>
onClick() {}

然后你可以使用Promise.all 来做多个promise,或者.then 来做一个promise。

不过,如果我可以建议的话,在迁移时,您应该考虑使用 Observable,因为它们比 Promise 更强大,并且与 Angular 原生集成。

Here is one of my previous answers 快速开始使用 Observables。

【讨论】:

  • 谢谢你的回答,我不想将模板逻辑绑定到组件逻辑,所以我可以使用 .resolve() 代替 .when() 吗?
  • 嗯,这是 Angular 的目的,将模板绑定到类......并且 resolve 不会改变这一点。 Resolve 用于验证 Promise,Promise.resolve 用于创建立即解决的 Promise。我不知道when 做了什么,但你可能可以,是的
【解决方案3】:

由于您提到您正在迁移,因此在可能的情况下使用可观察对象优于使用承诺。来自文档:

您通常可以使用 observables 而不是 Promise 来异步传递值。类似地,可观察对象可以代替事件处理程序。最后,由于 observable 传递多个值,因此您可以在可能构建和操作数组的地方使用它们。

https://angular.io/guide/comparing-observables

也就是说,finally 是 promise API 的一部分,可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

【讨论】:

  • 我尝试使用Promise.resolve().finally(() =&gt; {}),它说Promise,没有finally()方法。
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 2010-09-23
  • 2017-08-06
  • 2016-12-07
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多