Angular 5 - Promise 与 Observable - 性能上下文

标签 angular rxjs angular-observable

我有一个 Angular 5 站点,它从 REST API 接收数据,例如每个页面对 API 的 1-4 个请求,
发生的情况是请求有时需要很长时间(有时不需要)。

现在,所有请求都使用 在一个函数中执行。可观察 :

return this.http.post(url, {headers: this.header})
        .map(res => res.json())      
        .catch(this.handleError)

我的问题是 - 是否因为正在使用 Observable 而导致缓慢的过程发生?会 promise 性能会更好吗?
或者在性能上下文中 Observable 和 Promise 之间没有区别吗?

最佳答案

因为你的问题引起了我的兴趣。我创建了相同的测试,如下所示:

console.time('observable');
for(let i = 0; i < 10000; i++) {
  let user$ = of({
    name: 'yanis-git'
  });

  user$.subscribe(user => {
    // do something. Prefer not console.log because is ressource consuming.
  });
}
console.timeEnd('observable');

console.time('promise');
for(let i = 0; i < 10000; i++) {
  new Promise((resolve) => {
    resolve({
      name: 'promise'
    });
  }).then(user => {
    // do something. Prefer not console.log because is ressource consuming.
  });
}
console.timeEnd('promise');

结果看起来像这样(在您的浏览器/设置上可能会有所不同,但比例应该相同:
observable: 34.060791015625ms
promise: 103.4609375ms

编辑 :

内部具有异步特征的另一个实现:
console.time('observable');
for(let i = 0; i < 10000; i++) {
  let user$ = Observable.create((o) => {
    setTimeout(() => {
      o.next({
        name: 'observable'
      });
    });
  });

  user$.subscribe(user => {
    // do something. Prefer not console.log because is ressource consuming.
  });
}
console.timeEnd('observable');

console.time('promise');
for(let i = 0; i < 10000; i++) {
  new Promise((resolve) => {
    setTimeout(() => resolve({
      name: 'promise'
    }))
  }).then(user => {
    // do something. Prefer not console.log because is ressource consuming.
  });
}
console.timeEnd('promise');

结果很接近,但比赛是通过观察获胜的。
observable: 160.162353515625ms
promise: 213.40625ms

live sample

如果您想查看 stackblitz,请使用真实浏览器控制台查看计时器输出

关于Angular 5 - Promise 与 Observable - 性能上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235400/

相关文章:

Angular 等待绑定(bind)完成

html - 从 Angular 模板获取字符串而不是预期数字并输入 native 元素的值

javascript - subscribe 方法不是用 RxJS 触发的

angular - 如何在 Angular 和 Rxjs 中只调用一次 ajax?

angular - 为什么我们应该在 Angular 中使用 subscribe() 而不是 map()?

angular - 如何在for循环angular 7中使用可观察订阅

javascript - 未处理的 promise 拒绝警告 : TypeError: Converting circular structure to JSON with Jest + Angular

typescript - 我如何对依赖于 RC3 路由器的组件进行单元测试?

angular - Rx.ReplaySubject 订阅回调未被调用

Angular HTTP 拦截器订阅 observable 然后返回 next.handle 但抛出 TypeError : You provided 'undefined'