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