为什么我应该使用这样的 HTTP 可观察方法:
this.http.get("MyURL")
.subscribe(
(_url: any) => {
//TODO My job
},
(error: any) => {
//TODO My job
},
() => {
//TODO My job
});
而不是使用这样的 AJAX 方法:
$.ajax({
url: "MyURL",
success: function (result) {
//TODO My job
},
error: function () {
//TODO My job
}
});
我的意思是,有什么好处和坏处?
最佳答案
为什么要使用外部库来做 Angular 已经能够做到的事情?为什么您实际上会结合 Angular 使用 jQuery?
我认为你的问题的一个更好的标题是,为什么要使用 observables。当我开始使用 angular 时,我也遇到了同样的问题,但是在使用 angular 一年多之后,我在 observables 和 rxjs
上做了很多工作。在那段时间里,我学到了以下内容。
1-你不能取消 promise
假设有人进入屏幕 A,然后您像这样获取一些数据。
fetch(/** some end point */)
.then(res => res.json())
.then(() => {
// Handle the request here
});
当您能够处理请求时,用户会离开屏幕 A。在大多数情况下,这没什么大不了的,但是因为您想以尽可能最好的方式做事,您最好取消对请求的处理。使用原生 promise ,这是不可能的。阅读 this对此有很好的解释的文章使用 observables,这变得微不足道。您可以取消订阅 observable,这将确保不会执行不必要的代码。
专业提示:在 Angular 中,您可以在
ngOnDestroy
中执行此操作组件的生命周期。2 - 原生 Promise 有 2 种方法,rxjs 有更多。
如果你使用的是原生的 Promise 实现,你唯一能做的就是
then
和 catch
(在一个 promise 实例上)。这似乎绰绰有余,但使用 rxjs 你可以做更多的事情。示例
让我们说你的
/article/:id
端点有时会返回空值,因为没有找到文章。在 Promise 中,您的代码将如下所示。fetch('/article/5')
.then( res => res.json())
.then( res => {
if ( res !== undefined) {
// do something!
}
});
在 rxjs 中,这看起来更干净,如果只想对数据做一些事情,如果它在那里。这似乎不是一个很大的改进,但在生产中,您会发现自己想做的远不止过滤掉未定义的值。this.http.get("MyURL")
// p.s this line of code might not be needed depending on ur
// angular version
.map( res => res.json())
.filter( res => res !== undefined)
.subscribe(res => {
// Do something!
});
我对你的建议是使用 toPromise
无论您在做什么简单的事情,并在需要时逐渐使用越来越多的 rxjs 运算符。 map
, filter
和 takeUntil
将是一个很好的起点。我可以继续向你展示你可以用 rxjs 做的事情,这些事情很难用 Promise 来实现,但是那里有很多文章比我解释得更好。
TLDR
您可以编写更简洁的异步代码并用更少的代码做更多的事情。
关于javascript - 为什么要使用 observables 而不是 Ajax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47571880/