我们先看Promise的一个例子吧。下面代码摘自http://www.cnblogs.com/wangfupeng1988/p/6515855.html
wait = function (){
promise = new Promise( function(resolve, reject){
task = function(){
console.log("执行完成")
resolve()
}
setTimeout( task,2000 )
})
return promise
}
var w = wait()
w.then( function(){
console.log('ok 1')
}, function(){
console.log('err 1')
} ).then ( function(){
console.log('ok 2')
}, function(){
console.log('err 2')
} )
上面代码输出
先说明下上面代码运行过程再讨论Promise。
调用wait(...)函数, 因为setTimeout浏览器某模块开始计时,之后生成了一个promise对象,返回prmoise对象给w.再之后定时器计时结束调用task函数(回调)。
在调用task函数时由于Prmoise中的resolve()被执行了故执行w.then( 函数1,函数2 )中的第一个函数,接着又执行了下一个then()函数的第一个函数。
对于前面定时器那块执行顺序,可以写个输出查看
下面说明下Promise,Promise经常与new一起使用以建立对象,并且必须提供一个函数回调,我们把它取名叫foo()吧。这个回调是同步的或者立即调用的
(在上图中的输出也能看Promise( )中的回调是立即调用的),通常foo( )接收两个回调函数,称为resolve( )和reject( )。
Promise对象有个then()方法,这个方法也有两个参数。分别对应着resolve()被调用时和reject()被调用这两种情况。
当第一个参数resolve()被调用时,Promise对象的then()方法里的第一个方法立即被调用。因此上面的代码中执行了console.log('ok 1')。
那为什么又执行了console.log('ok 2')呢。因为这是Promise的链式调用, Promise 的链式调用。也就是promise().then().then().。。。。。
链式调用内容其实很多的。比如这个链如何终止?
Promise内容还有很多,比如如果传给resolve()的是一个非Promised,非thenable的立即值,这个promise就会立即用这个值完成,否则这个这个值会被递归的展开。
上面的内容仅仅是Promise()的初步扫盲。