从promise到observable

1、promise
先说用法,promise的用法是很难理解的,看如下代码:

var promise = new Promise(function(resolve, reject){
异步操作(
异步操作的回调函数(){
if(ok){
resolve(message)
}else{
reject(error)
}
}
)
});
promise.then(onresolved(message), onrejected(error)).then(onresolved(message), onrejected(error))…

a、最简单理解版本:
Promise接受一个函数参数,函数体中描述异步操作,开始立即执行这个作为参数传入的函数,同时得到实例化的promise,promise.then()接受两个函数作参数,分别是状态为resolve、reject的时候执行的函数,当之前的异步操作完成后,then中的函数开始执行,同时返回一个promise实例,此实例可以继续加then,当实例状态变为resolve或reject后,就会去执行下一个then中的函数。
b、理解promise是如何实现的
resolve, reject都是定义在promise内部的,Promise构造函数接受一个函数作为参数,这个函数会在Promise中立即执行,而reject,resolve都是Promise的成员函数,Promise会根据传入函数的执行结果选择执行reject还是resolve,以resolved为例,在实例上会有一个onResolvedCallback,也就是resolved之后的回调函数,回调函数哪里来,这就引出了then方法:
在Promise的prototype上定义了then方法,当调用then方法的时候,调用者(new出来的Promise)的status(status指向Promise的实例)有可能是pending,也有可能是resolved、rejected(感觉不可能啊,毕竟Promise会塞入事件循环中去,更新,想明白了,因为Promise中如果是同步操作的话不加入eventloop,Promise接受的函数体中的内容是真正的立即执行的)。无论哪种状态,then的函数体都会new一个Promise,在这个new的Promise中写入执行逻辑,new的Promise中的内容立即执行,以pending为例,只考虑resolved的一支,首先会向onResolvedCallback上添加一个function,function中执行一下then接受的参数(回调函数),判断一下执行完毕的结果是不是个Promise,如果是的话执行其then方法,无论是不是,then都返回了一个崭新的Promise。
有了原理上的描述,重新阐述一下Promise的用法,new的时候,在参数中传入一个函数,函数立即执行,函数中调用resolve,则当resolve执行之时,会找到实例原型链上的then方法中向实例的回调函数数组上注册的回调函数,then方法中会返回一个新的Promise,如果在then接受的回调函数中返回了一个Promise,那么下一个then中接受的函数的参数就是上一个then中的Promise中resolve的值!
快速获得一个Promise对象的方法是p = Promise.resolve(),相当于p = new Promise(function(resolve){resolve}),后者用new注意一定要resolve,否则状态一直是pending,p.then接受的函数不会执行的。


c、es6提供的promise的api








promise与observable的区别,
1、promise不能连续返回多个值,一旦状态确定不可逆,observable可以连续发送数据流。
2、promise不能取消,observable对象拥有dispose方法,可以取消。
3、observable是惰性执行的。