欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

promise 和Observables的区别 有大用

Promise是一种异步编程解决方案,es6中原生提供了Promise对象有三种状态:pending、resolved、rejected。状态一旦改变,就不会再变。        


       

StackOverflow上有一个讨论:What is the difference between Promises and Observables?            

一篇有用的博客:Angular2 Observables, Http, and separating services and components            

Angular官网的一篇文章:Observables compared to other techniques            

Observable和promise的区别:            

Observables are declarative; computation does not start until subscription. Promises execute immediately on creation. This makes observables useful for defining recipes that can be run whenever you need the result.                

Observable是陈述式的,计算直至subscription才会触发。这和promise很不同——promise创建之后,立即执行。            

Observables provide many values. Promises provide one. This makes observables useful for getting multiple values over time.                

Observable提供多个值,而promises只能提供单个值。            

Observables differentiate between chaining and subscription. Promises only have .then() clauses. This makes observables useful for creating complex transformation recipes to be used by other part of the system, without causing the work to be executed.                

Observable可以借助rxjs丰富的Operators,组合成复杂的transformation recipes, 便于应用内的重用,而promise只有一个then操作。            

Observables subscribe() is responsible for handling errors. Promises push errors to the child promises. This makes observables useful for centralized and predictable error handling.                


               

来自  https://blog.csdn.net/i042416/article/details/115217907                


               

Observable 和 Promise 的区别

参考: promise-vs-observable

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的一大优势。


来自  http://t.zoukankan.com/ygunoil-p-15523556.html


普通分类: