说“ rxjs可观察”在没有诺言的地方要用多个

时间:2019-02-03 08:55:18

标签: javascript ecmascript-6 rxjs es6-promise

我知道promise和observables的工作方式,但是我不确定人们何时说promise一次只能观察一个事件,那么可观察事件可以发生多个事件。

我在互联网上查询了内容,但无法通过示例找到定义来理解其确切含义。

2 个答案:

答案 0 :(得分:2)

从本质上讲,一个承诺会解析为一个值或拒绝一个错误。

另一方面,可观察到的是可以随时间分布的值流的包装器。例如,与鼠标单击或Websocket相关的可观察对象

在角度上,http get observable表现为like*的承诺,因为它仅返回单个值。

我确信有人可以指导您进行更深入的解释,但这本质上是问题的症结所在。

答案 1 :(得分:2)

Observable可以在不同的时间发出不同的值,Promise只能一次解析为一个值(然后再也无法解析)。

简单说明:

让我们尝试获得三个异步结果:“ a”,“ b”和“ c”,每个结果再延迟1秒。有了一个可观察到的,可以这样完成:

var result = Rx.Observable.create((observer) => {
    setTimeout(() => observer.next("a"), 1000);
    setTimeout(() => observer.next("b"), 2000);
    setTimeout(() => (observer.next("c"), observer.complete()), 3000);
});
result.subscribe(x => console.log(x));  

以上内容将产生此输出,每行比上一行晚出现1秒:

a
b
c

如果您尝试使用一个(!)承诺来执行此操作,则将无法使用:

var result = new Promise(resolve => {
    setTimeout(() => resolve("a"), 1000);
    setTimeout(() => resolve("b"), 2000);
    setTimeout(() => resolve("c"), 3000);
});
result.then(x => console.log(x));

这只会输出一个结果(1秒后):

a

即使试图用“ b”和“ c”来解决诺言,也行不通:一个诺言只能解决一次。随后对resolve的所有调用都将被忽略。

然而,可观察对象可以发射多次,每次发射的值都不同。

当您需要一个(可能很复杂的)异步结果时,诺言是很棒的。当您期望一系列异步结果时,可观察的方法更合适。