在Angular中Promise和Observable之间有什么区别?

每一个例子都有助于理解这两种情况。在什么情况下,我们可以使用每种情况?


当前回答

在第一次阅读教程和文档时,我遇到了一个不明显的问题,那就是多播的想法。

确保您知道默认情况下,多个订阅将触发Observable中的多个执行。对单个HTTP调用的多个订阅Observable将触发多个相同的HTTP调用,除非您.share()(启用多播)。

一个承诺迫使你一次处理一件事,解开它的数据,处理异常,对async/await等很酷的事情有语言支持,否则就很简单了。

Observable有很多钟和哨子,但你需要了解你正在使用的力量,否则它可能被滥用。

其他回答

承诺:

异步事件处理程序-Promise对象表示异步操作的最终完成(或失败)及其结果值。

语法:new Promise(executor);

例如:

var promise_eg = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

promise_eg.then(function(value) {
  console.log(value);
  // expected output: "foo"
});

console.log(promise_eg);

关于Promise:

它有一个管道,因此在调用时只返回一次值。它是一个单向处理程序,因此一旦调用,您可能无法取消。可以在when()和then()之间使用有用的语法。

观察结果:

可观测值是一段时间内多个值的惰性集合。这是一种非常好的异步操作方法。它可以用具有跨平台支持的rxjs实现,也可以与Angular/React等一起使用。

它的作用类似于流衬垫,可以是多管道。因此,一旦定义,您可以在许多地方订阅以获得返回结果。

语法:从“@reactivex/rxjs”导入*作为Rx;初始化:

Rx.Observable.fromEvent(button, "click"),
Rx.Subject()

etc.

订阅:RxLogger.getInstance();

例如:

import { range } from 'rxjs';
import { map, filter } from 'rxjs/operators';

range(1, 200).pipe(
  filter(x => x % 2 === 1),
  map(x => x + x)
).subscribe(x => console.log(x));

由于它支持多管道,您可以在不同的位置订阅结果,

它有比承诺更多的可能性。

用法:

它有更多的可能性,如贴图、过滤器、管道、贴图、concatMap等。

承诺只针对单一价值或解决方案。可观测数据是数据流。可观的东西可以取消,但承诺不能取消。

至少对我来说,最鲜为人知的是:

承诺总是异步的,但可观测可以是同步的和异步的。

如果你想详细了解它,我写了一篇关于这个答案的博客文章——JavaScript中Observables和Promise之间的4个区别

承诺:

提供单一的未来价值;不懒惰;不可撤销;

可观察:

随时间推移发出多个值;懒惰的可取消;支持map、filter、reduce和类似运算符

如果愿意,可以在Angular中调用HTTP时使用promise而不是observables。

承诺是渴望的,而可观察者是懒惰的。Promise总是异步的,而Observable可以是同步或异步。Promise可以提供单个值,而Observable是值流(从0到多个值)。您可以将RxJS运算符应用于Observable,以获得新的定制流动

Promise在异步活动完成或失败时发出单个事件。

Observable类似于流(在许多语言中),允许传递至少零个或多个事件,其中每个事件都需要回调。

与Promise相比,Observable通常更受欢迎,因为它提供了Promise等的亮点。使用Observable,您是否需要处理0、1或各种事件并不重要。您可以针对每种情况使用类似的API。

承诺:promise只产生一种价值

例如:

const numberPromise = new Promise((resolve) => {
    resolve(5);
    resolve(10);
});

numberPromise.then(value => console.log(value));
// still prints only 5

可观察:在一段时间内发出多个值

例如:

  const numberObservable = new Observable((observer) => {
        observer.next(5);
        observer.next(10);
    });

numberObservable.subscribe(value => console.log(value));
// prints 5 and 10

我们可以想象一个可观察的流,它在一段时间内发出多个值,对发出的每个项调用相同的回调函数。无论该数据是作为单个值还是作为多个值在某段时间内传输。

承诺:

承诺不是懒惰承诺不能取消

可观察:

可观察就是懒惰。“可观察”是缓慢的。直到我们订阅了它。可以使用unsubscribe()方法取消Observable另外,Observable提供了许多强大的运算符,foreach、filter、reduce、retry、retryWhen等。

角度承诺与可观测