我知道promise和observables
的工作方式,但是我不确定人们何时说promise
一次只能观察一个事件,那么可观察事件可以发生多个事件。
我在互联网上查询了内容,但无法通过示例找到定义来理解其确切含义。
答案 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
的所有调用都将被忽略。
然而,可观察对象可以发射多次,每次发射的值都不同。
当您需要一个(可能很复杂的)异步结果时,诺言是很棒的。当您期望一系列异步结果时,可观察的方法更合适。