es6(Promise)

Peomise简介

Promise,他是一个对象,是用来处理异步操作的,可以让我们写异步调用的时候写起来更加优雅,更加美观便于阅读。顾名思义为承诺、许诺的意思,意思是使用了Promise之后他肯定会给我们答复,无论成功或者失败都会给我们一个答复,所以我们就不用担心他跑了哈哈。所以,Promise有三种状态:pending(进行中),resolved(完成),rejected(失败)。只有异步返回的结构可以改变其状态。所以,Promise的过程一般只有两种:pending->resolved或者pending->rejected,pending的状态的转变是不可逆的。

Promise对象还有一个比较常用的then方法,用来执行回调函数,then方法接受两个参数,第一个是成功的resolve的回调,另一个是失败rejected的回调,第二个失败的回调参数可选。并且then方法里也可以返回Promise对象,这样就可以链式调用了。接下来上代码:

       var A = new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve({ value: 'A' })
            }, 2000)
        })
        .then(function (data) {
            console.log('A做完了 B在做',data)
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    resolve({ value: 'B' })
                }, 2000)
            })
        }, function (err) {
            console.log(err)
        })
        .then(function(data){
            console.log('B做完了 C在做',data)
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    resolve({ value: 'C' })
                }, 2000)
            })
        },function(err){
            console.log(err)
        })
        .then(function(data){
            console.log('C做完了 D在做',data)
            return new Promise((resolve, reject) => {
                setTimeout(function () {
                    resolve({ value: 'D' })
                }, 2000)
            })
        },function(err){
            console.log(err)
        })
        .then(function(data){
            console.log('D做完了 没了',data)
        },function(err){
            console.log(err)
        })

打印结果如下

Promise实例

下面我们用Promise简单的封装一个加载图片的函数

        function loadURL(url){
            var img = new Image();
            return new Promise((resolve,reject)=>{
                img.onload = function(){
                    resolve(img)
                }
                img.onerror = function(){
                    reject(`${url} is not an effective URL`)
                }
                img.src = url
            })
        }
                    
       loadURL('./xxx.png').then(img=>document.body.appendChild(img),err=>console.log(err))

Promise API方法

Promise API有resolve,reject,all,race方法,在它原型上有then,catch方法

        var p1 = Promise.resolve(1) //返回resolved的Promise对象
        var p2 = Promise.reject(2) // 返回rejected的Promise对象
        var p3 = Promise.all(PromiseArray) 
        // PromiseArray 每个Promise对象都为resolved 返回每个Promise状态对应的值,形成的数组

all用法其实也简单,数组里的每个Promise对象的状态都应为resolved,只要有一个状态为rejected就会返回当前对象,否则返回状态为resolved的数组

        var p1 = Promise.resolve(1)
        var p2 = Promise.reject(2) 
        var p3 = new Promise(resolve=>resolve(3));
        var p4 = Promise.all([p1,p3]) //返回状态为resolved的数组
        var p5 = Promise.all([p1,p3,p2]) //返回状态为rejected的对象-->p2

race方法一般用来测试网络接口的请求速度,谁快返回谁

        var p1 = Promise.resolve(1)
        var p2 = Promise.reject(2) 
        var p3 = new Promise(resolve=>setTimeout(()=>resolve(3),3000));
        var  p4 = new Promise((suc,err)=>{
            setTimeout(function(){
                suc(4)
            },4000)
        }) 
        var p5 = Promise.race([p3,p4,p2]);  //返回最快的 --> p2

catch方法负责失败回调函数,而then负责成功回调函数

        Promise.reject(3).then(data=>console.log(data)).catch(err=>console.log(err+'err')) // 3err
        Promise.resolve(3).then(data=>console.log(data)).catch(err=>console.log(err+'err')) // 3

then方法,当返回时Promise对象,接下来的then所执行的函数,由返回的Promise对象决定;不是Promise对象,返回一个状态为resolve状态Promise对象

返回的时Promise对象时执行结果

        var p = new Promise(function (resolve, reject) {
            resolve(12)
        })        
        p.then(data=>new Promise((suc,err)=>{
            err(data)
        }),err=>err+'err')
        .then(data=>console.log(data),err=>console.log(err+'err')) //12err

        p.then(data=>new Promise((suc,err)=>{
            suc(data)
        }),err=>err+'err')
        .then(data=>console.log(data+'suc'),err=>console.log(err+'err')) //12suc

返回的不是Promise对象时执行结果

        var p = new Promise(function (resolve, reject) {
            resolve(12)
        })
        p.then(data=>data+'suc',err=>err+'err')
        .then(data=>console.log(data)) //12suc

        var p = new Promise(function (resolve, reject) {
            reject(12)
        })
        p.then(data=>data+'suc',err=>err+'err')
        .then(data=>console.log(data)) //12err

猜你喜欢

转载自blog.csdn.net/qq_42676363/article/details/82974679