首页
登录 | 注册

promises与observables的区别

1.observables 是lazy evaluation。

比如下面的代码片段,对于promise,无论是否调用then,promise都会被立即执行;而observables却只是被创建,并不会执行,而只有在真正需要结果的时候,如这里的foreach,才会被执行。

再举个例子,比如这里不是用setTimeout模拟异步操作,而是去请求一个url,那对于promise来说,then的作用是处理返回结果,而http请求在第一步就已经发送了;相反,对于observable来说,由于它发现你其实现在并不需要异步调用的结果,所以它干脆就不发送请求,而只有你真正需要响应数据的时候才会发送请求。

var promise = new Promise((resolve) => {
    setTimeout(() => {
        resolve(42);
    }, 500);
    console.log("promise started");
});

//promise.then(x => console.log(x));

var source = Rx.Observable.create((observe) => {
    setTimeout(() => {
        observe.onNext(42);
    }, 500);
    console.log("observable started");
});

//source.forEach(x => console.log(x));

2.observables可以被cancel。

observable能够在执行前或者执行过程中被cancel,或者叫做dispose。

下面的例子中,observable在0.5秒的时候被dispose,所以日志“observable timeout hit”不会被打印。

var promise = new Promise((resolve) => {
    setTimeout(() => {
        console.log("promise timeout hit")
        resolve(42);
    }, 1000);
    console.log("promise started");
});

promise.then(x => console.log(x));

var source = Rx.Observable.create((observe) => {
    id = setTimeout(() => {
        console.log("observable timeout hit")
        observe.onNext(42);
    }, 1000);
    console.log("observable started");

    return () => {
        console.log("dispose called");
        clearTimeout(id);
    }
});

var disposable = source.forEach(x => console.log(x));

setTimeout(() => {
    disposable.dispose();
}, 500);

3.observable可以retry,或者多次调用。

上面的代码,可以拿到promise和observable的变量。对于promise,不论在后面怎么调用then,实际上的异步操作只会被执行一次,多次调用没有效果;但是对于observable,多次调用forEach或者使用retry方法,能够触发多次异步操作。

4.observable可以进行组合变换。

observable可以看做列表,可以进行各种组合变换,即LINQ操作,比如merge,zip,map,sum等等。这是observable相对于promise的一大优势。


参考:

https://egghead.io/lessons/rxjs-rxjs-observables-vs-promises

http://reactivex.io/documentation/operators.html


相关文章

  • 字符串: 字符串用单引号(')或双引号(")括起来,不可变 1,find通过元素找索引,可切片,找不到返回-1 2,index,找不到报错. 3,split 由字符串分割成列表,默认按空格. 4,captalize 首字母大写,其 ...
  • 前端基础---JS基础
    背景介绍 Javascript 是一种运行在客户端的脚本语言 应用场景: 1.网页特效 2.服务端开发(Node.js) 3.命令行工具(Node.js) 4.桌面程序(Elextron) 5.APP(Cordova) 6.控制硬件-物联网 ...
  • 一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!
    本文来自我的知识星球的球友投稿,他在最近的校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由作者--泽林提供,部分答案由Hollis整理自知识星球<Hollis和他的朋友们>中「直面Java」板块. 经历了漫长一个月的 ...
  • 提升不止一点点,Dubbo 3.0 预览版详细解读
    Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网.网易考拉等互联网公司,也不乏中国人寿.青岛海尔等大型传统企业.更多用户信息,可以访问Dubbo @GitHub,issue#1012: Wa ...

2020 jeepshoe.net webmaster#jeepshoe.net
13 q. 0.281 s.
京ICP备10005923号