Promise胡思乱想(一)

来源:互联网 发布:化学软件初中 编辑:程序博客网 时间:2024/05/16 07:19

我们先看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()的初步扫盲。

原创粉丝点击