JS中promise对象的作用与使用

JavaScript08

JS中promise对象的作用与使用,第1张

promise的作用:ajax是异步请求,多层嵌套会造成回调地狱,promise模拟同步,将异步回调类似于同步来处理业务逻辑。

var p = new Promise(function(){

//这里用于处理异步的回调

}),必传回调函数,不传程序会抛出异常。

创建实例对象时,回调函数会立即执行。

promise的三种状态:

pending:正在进行状态

fulfilled:完成状态

rejected:失败状态

传参1 resolve,是个函数,只要这个函数执行了说明是成功状态,参数2选传,rejecte,是个函数,这个函数执行了说明是失败状态。这两个只能执行一个,变化不可逆。

promise两种结果:

从进行到失败

从进行到成功

通过rejecte(data)h或者resolve(data)将异步响应的数据提取出来,在promise外部使用。

promise的then方法,用于处理成功或者失败的回调。

//接收上面的回调

var p1 =p.then(function(res){

})。执行后返回一个promise对象,但和p不是同一个对象。当p1执行了并且return出res,就可以连缀

p1=p.then(function(res){

return res

}).then(function(data){

//处理成功回调

}).catch(function(){

//处理失败回调

})

可以简写p.then(function(res){

//处理成功信息

},function(err){

//处理异常信息

})。但一般不这样写。

使用案例如下,

promise的then方法是异步方法,但会优先于定时器执行。

作为一名程序猿,经常遇到回调函数的情况,原生js的回调函数是一层一层的嵌套调用,而es6提供了一种新的写法,Promise,它可以把原本的嵌套回调函数实现成横向的调用,即链式调用。

下面看一个Promise的简单用法:

接着开始模拟:

首先,_Promise构造函数会接收一个函数resolver并执行,函数中又包含resolve和reject两个参数,然后,_Promise构造函数生成的实例有三种状态,分别是pending(初始值)、fullfilled(成功)和rejected(失败),且由pending变为成功或者失败后状态不可逆。

resolve和reject函数执行的时候会先判断状态,如果是pending则执行,且将状态变为fullfilled或者rejected,并将resolve/reject函数中参数传递给_result,以便then函数调用时使用。

因为有可能存在链式调用,所以执行then函数的返回值需要判断,如果isResolve或者isReject函数返回的是一个新的_Promise实例,则返回这个实例,否则返回当前实例

至此,Promise已经模拟完成~