javascript - 为什么要使用 observables 而不是 Ajax?

标签 javascript ajax angular rxjs

为什么我应该使用这样的 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 实现,你唯一能做的就是 thencatch (在一个 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 , filtertakeUntil将是一个很好的起点。
我可以继续向你展示你可以用 rxjs 做的事情,这些事情很难用 Promise 来实现,但是那里有很多文章比我解释得更好。
TLDR
您可以编写更简洁的异步代码并用更少的代码做更多的事情。

关于javascript - 为什么要使用 observables 而不是 Ajax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47571880/

相关文章:

javascript - 在 MVC 中使用 JsonResult 重定向到操作

jquery - Accordion 脚本在 ajax 更新面板中不起作用

Angular 6 应用程序将其发布到服务器后响应时间过长

Angular2 FormGroup 禁用字段值

angular - 无法解析 angular5 中的类型文档

javascript - 如何获取当前对象名称以显示在 ng-repeat 中

javascript - jquery 中 DOM 元素的手动垃圾收集是否完全提高了浏览器性能?

javascript - 关闭Iframe模态框后刷新父页面

javascript - 创建 promise 回调

javascript - Angularjs UI 多选和初始选择