promise学习之语法篇

    进阶使用

     手写promise

     常见面试题

前言

之前一直没有专门的去学过promise,只知道它可以用来解决'回调地狱',是异步的一种实践方式。最近在项目中遇到无痛感刷新token时,要用到promise的特性,故在此记录下学习历程。

promise解决的问题

关于异步使用的最多的就是发送ajax请求后台数据,当一个页面不止一个请求且请求有先后关系时,就会遇到"回调地狱"的问题,在不使用async+await的情况下,我们通常会写出类似下面的代码

        this.$axios.post(url,{}).then(res=>{

            if(res.data.code==200){

                this.$axios.post(url,{id:res.data.id}).then(resp=>{

                    if(resp.data.code==200){

                        console.log('接口请求完成')

                    }

                })

            }

        })

坦然,当请求的接口无限堆砌的时候,我们的代码会变得臃肿和难以阅读,当遇到bug我们很难直接进行定位,这不利于高效开发和代码维护,也不利于协同开发。

使用promise改写    

let p1 = new Promise((resolve,reject)=>{

     this.$axios.post(url,{}){

        if(res.data.code==200){

            resolve({id:res.data.id})

        }

    }

})

let p2 = new Promise((resolve,reject)=>{

        resolve(p1)

})

p2.then(res=>{

        this.$axios.post(url,{id:res.id}).then(resp=>{

                console.log('接口请求完成')

        })

})        

从视觉上看,我们将两次请求进行分开,结构更加清晰

promise语法

1-promise实例

    let p = new Promise((resolve,reject)=>{//使用new操作符实例化promise,会返回一个promise对象

            resolve() //发出成功通知

            reject()//发出失败通知

    }).then()  //then方法相当于一个拦截器,允许我们获取resolve或者reject抛出的值,如果为空,则会向下一个                           then传递

    .then(success=>{//接受resolve通知

    },error=>{//接受reject发出的通知

    })

2-特殊点--新promise实例必须抛出状态而then(finally、catch)方法返回的promise默认抛出resolve

    let p = new Promise((resolve,reject)=>{

        //如果不手动抛出状态那么打印p的结果为pending

        reject('出错了,请联系管理员')

    })

    let p2 = p.then(null,err=>{

        console.log(err) //通过.then拦截抛出状态,这里得到'出错了,请联系管理员'

    })

    let p3 = p2.then(ok=>{ //p2是p通过then返回的promise,会默认抛出resolve,因此将打印'ok'

        console.log('ok')

        return new Promise((resolve,reject)=>{ //如果想控制抛出状态,那么我们可以在then中return一个新的                                                                                     promise

                reject('阿哦,出错了~')

        })

    },error=>{

        console.log('error')

    })

    p3.then(null,reason=>{

        console.log(reason) //这里的p3是一个新的promise,因此将根据抛出状态进行捕获

    })

3-异常处理

    new Promise((resolve,reject)=>{

        //抛出错误

        reject('err msg')

        //或者

        throw new Error('err msg')

    }).then(null,err=>{//如果只有一个promise我们可以将then的第二个参数当作异常捕获的回调

    }).catch(err=>{//当存在链式promise时,我们可以使用catch来统一捕获异常并处理

    })

4-异步后处理

    new Promise((resolve,reject)=>{

        reject('err')

    }).catch(err=>{}).finally(()=>{

        //这里类似jquery中ajax请求的complete,我们可以在这里关闭一个loading动画

    })

5-resolve/reject的妙用

    let data = null,

        pre_id = '上一个接口数据';

    function getData(){

       //缓存

      if(data){

        //由于外部使用了promise语法获取函数返回值,因此不能直接return data

        return Promise.resolve(data)

      }

    if(!pre_id){

        return Promise.reject('接口缺少请求参数')

    }    

       return new Promise((resolve,reject)=>{

                this.$axios.get(url,{pre_id}).then(res=>{

                    data = res.data

                    resolve(data)

                })

        }) 

        .then(res=>{

            return res

        })

        .catch(err=>{})

        .finally(()=>{})

    }

    setInterval(()=>{

            getData().then(res=>console.log(res)).catch(err=>{})

    },1000)

6-批量执行promise

let p1 = new Promise((resolve,reject)=>{})

             .catch(err=>{})//如果p1单独进行了错误处理,那么all方法将无法监听到p1的resolve,all得到的是catch返回的                                                       promise,有默认的resolve

let p2 = new Promise((resolve,reject)=>{})

Promise.all([p1,p2]) //我们只需要给all方法传递一个由promise组成的数组,Promise就会批量进行调用

.then(res=>{ //这里的成功必须是p1和p2都抛出resolve状态,否则将走catch接口

}).catch(err=>{})

7-更松散的批量执行之allSettled

代码同6,在Promise.allSettled([p1,p2]).then(res=>{})//不强制p1p2均为resolve,永远不会走catch接口

8-龟兔赛跑之-race

let p1 = new Promise((resolve, reject) => {

            setTimeout(()=>{

                reject('网络错误')

            },180)

})

let p2 = new Promise((resolve, reject) => {

            setTimeout(()=>{

                resolve('ok')

            })

})

Promise.race([p1,p2]).then(res=>{

            console.log(res)

}).catch(err=>{

            console.log(err)

})

以上就是promise的语法内容

我们学习任何事物都是一次从无到有、从走到跑的过程,只有了解其存在的语法,才能在实战中运用起来,大家加油

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 在ES6当中添加了很多新的API其中很值得一提的当然少不了Promise,因为Promise的出现,很轻松的就给开...
    嘿_那个谁阅读 3,661评论 2 3
  • # Ajax标签(空格分隔): 笔记整理---[TOC]### 从输入网址开始:- 在学习ajax之前,你应该先了...
    V8阅读 248评论 1 0
  • 前言 本文旨在简单讲解一下javascript中的Promise对象的概念,特性与简单的使用方法。并在文末会附上一...
    _暮雨清秋_阅读 2,178评论 0 3
  • //本文内容起初摘抄于 阮一峰 作者的译文,用于记录和学习,建议观者移步于原文 概念: 所谓的Promise,...
    曾经过往阅读 1,221评论 0 7
  • 1、Promise的涵义 promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更...
    叶苏芒阅读 451评论 0 0