这篇博客涵盖了Javascript中observable和promises的区别,并附有实例。
observable和promises是用来处理javascript中的异步调用的。这将有助于在前端应用程序(如Angular、react和vuejs)以及服务器端应用程序(如node环境)中消费其余的API调用。
Promises是javascript中最新的功能,它被用来做异步操作 RXJS框架中的Observable被用来做许多异步调用,能够提供取消操作。
ES6承诺不可取消
这些主要是用来避免回调地狱。如果操作成功,意味着承诺得到解决,结果是一个值,否则操作抛出一个错误信息,承诺拒绝,结果是一个错误信息 ES6承诺是不可取消的。诺言对于不可取消的单一异步操作是很有用的,首先诺言使用new Promise声明,提供里面的同步代码。
var myproimse = new Promise((resolve, reject) => {
if (success) {
resolve("single object is returned");
}
else {
reject("Failure message"));
}
});
一旦承诺被定义,你需要提供then和catch来捕捉成功和错误事件。
promise.then((success) => console.log(success)) // single object is returned
.catch((err) => console.log(error)); // Failure message
then中的回调将在承诺解决时执行,catch将在错误信息时执行。
RXJS可观察事件是可取消的
这适用于数据流中的多个事件,例如按钮点击事件,这将不会被调用,直到用户发起的行动。其结果是成功、失败和完成是最小的事件,但有多个事件,所以我们必须为每个事件提供回调。
下面是一个创建可观察对象的例子,它定义了三个事件 下一个事件有值 错误事件有失败信息 完成事件没有参数
import { Observable } from 'rxjs';
const observableObject = new Observable(myobserver => {
myobserver.next("successvalue");
myobserver.error("failed");
myobserver.complete();
});
观察对象使用subscribe来订阅成功、错误和完成的三个回调。
console.log('Start ');
observableObject.subscribe({
next(value) { console.log('next: ' + value); },
error(err) { console.error('error: ' + err); },
complete() { console.log('complete:'); }
});
console.log('End');
而输出是
Start
next: successvalue
error: failed
End
JavaScript中ES6 Promise和RXJS Observable的区别
| 诺言 | 可观察 |
|---|---|
| 异步性 | 异步调用 |
| 一旦启动异步调用,就不能取消 | 可以使用unsubscribe()方法取消请求 |
| 总是返回单一值--要么承诺被解决,要么拒绝错误信息 | 基于失败、成功、重试、取消操作的多个值 |
| 只对单一事件起作用 | 在时间进程中支持多个事件流 |
| 重试是不可能的 | 使用重试操作者可以重试,使用基于条件操作者的retryWhen。 |
| 早期加载并返回单一结果,要么成功要么失败 | 懒加载,在需要时返回多个值 |
| 不支持运算符 | 支持数组类型的操作符-map,filter,forEach,reduce等。 |