ES6-promise
Promise是异步编程的一个解决方案,所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息
Promise状态:pending--进行中、fulfilled--已成功、rejected--已失败
Promise特点:①状态不受外界影响;②一旦状态改变,就不会再变,任何时候都可以得到这个结果;pending-->fulfilled或者pending-->rejected这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果;③避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易
promise缺点:①无法取消promise,一旦新建就立即执行,中途不能取消;②如果不设置回调函数,promise内抛出的错误不会反应在外部;③处于pending状态时,无法得知进行到哪一个阶段
①then用法:
then方法是定义在原型对象Promise.prototype上的,作用是为promise实例添加状态改变时的回调函数,
then方法返回一个新的promise实例(不是之前的promise实例),因此可以用链式写法,then回调函数后再调用另一个then方法
(采用链式的then,可以指定一组按照次序调用的回调函数。这时,前一个回调函数,有可能返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用)
//代码使用then方法,依次指定了两个回调函数 getJSon('/posts.JSON').then(function(JSON){ return JSON.post //第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数 }).then(function(post){ //... })
then中传了两个参数,第一个对应resolve的回调,第二个对应reject的回调,这两个是可选的
p.then( (data)=>{ console.log('resolved',data) }, (err)=>{ console.log('rejected',err) } )
②catch用法:Promise.prototype.catch()
catch方法:捕捉promise错误函数,和then函数参数中rejected作用一样,处理错误,由于Promise抛出错误具有冒泡性质,能够不断传递,会传到catch中,所以一般来说所有错误处理放在catch中,then中只处理成功的,同时catch还会捕捉resolved中抛出的异常
p.then( (data)=>{ console.log('resolved',data) } ).catch( (err)=>{ console.log{'rejected',err} } )
③Promise.all方法
Promise.all([promise1,promise2]) 参数为对象数组,所有的对象状态为resolved时,该对象为resolved,有一个为rejected,该对象为rejected
④Promise.race方法
Promise.all([promise1,promise2]) 参数为对象数组,有一个首先执行了何种状态,该对象为此状态,并执行相应函数
⑤Promise.prototype.finally()
finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的
finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果
⑥Promise.resolve()方法
有时需要将现有对象转为 Promise 对象,Promise.resolve()方法就起到这个作用
Promise.resolve('foo')
//等价于
new Promise(function(resolve){ resolve( 'foo' )})
Promise简单封装
function promiseM(callback) { this.status = 'pendding' this.msg = '' callback((data) => { this.status = 'resolve' this.msg = data },(err) => { if (this.status === 'resolve') return this.status = 'reject' this.msg = err }) } promiseM.prototype.then = function () { let cb = arguments let that = this let timer = setInterval(function () { if(that.status == 'resolve') { cb[0](that.msg) clearInterval(timer) } else if(that.status == 'reject') { if(!cb[1]) { clearInterval(timer) throw that.msg + ' No Exit' } else { cb[1](that.msg) clearInterval(timer) } } }, 500) } function fn() { return new promiseM(function (resolve, reject) { resolve('success') }) } fn().then(function (res) { console.log(res) }) // success

浙公网安备 33010602011771号