promises与observables的区别

1.对于promise,无论是否调用then。promise都会立即执行;而observables只是被创建,当调用的时候才会被执行。

//(1)f1提供回调函数给f2 —— 会产生“回调地狱”
 function f1(){
   f2( function(data){ console.log(data)} );
 }
 function f2( fn ){
   setTimeout(function(){
      fn( 999 );
   }, 0) 
 }
//(2)Promise
 function f1(){
   var p = f2();
   p.then( fn ).catch( fn );
 }
 function f2(  ){
  return new Promise( f1, f2 ){
      setTimeout(function(){
          if()f1(999);
          else f2(888);
      }, 0) 
  }
 }
//(3)Observable —— Angular解决返回异步数据的方案
  function f1(){
   var obs = f2();
   obs.subscribe((data)=>{   //订阅“可被关注的对象”
        console.log(data);
   })
 }
 function f2(  ){
  return new Observable( f1 ){ //返回一个“可被关注/订阅”对象
      setTimeout(function(){
          f1(999)
      }, 0) 
  }
 }

      再举个例子,比如这里不是用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.Promise 具有 3 个状态:pending、resolved、rejected(如果 Cancelable Promise 正式通过,那么还会增加一个状态)

Observable 有 N + 3 个状态:idle、pending、resolved_0、resolved_1 … resolved_N、completed 和 error。

总结:相比于 Promise 这个有限状态机而言,Observable 既可能是有限状态机,也可能是无限状态机(N 为无穷)。

3.observables可以被取消,中断。

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

4.Promise ,由于有且只有一个数据,所以无需复杂的操作,仅需要一个简单的变换(返回值)或者组合(返回另一个 Promise)功能即可,甚至还可以把组合变换与使用统一为一个操作,也就是我们的 .then。

Observable,由于可以有任意多个数据。

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

observable可以进行组合变换。

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

参考:https://blog.csdn.net/u010130282/article/details/54633117

https://blog.csdn.net/napolunyishi/article/details/51339006

猜你喜欢

转载自blog.csdn.net/chaoxiao1231/article/details/81209069