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

 

posted @ 2021-07-07 14:54  飞扬*  阅读(35)  评论(0)    收藏  举报