promise学习笔记

1.Promise是什么?

    主要用于异步计算,可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。

可以在对象之间传递和操作Promise,帮助我们处理队列。

2.异步产生的原因

    JavaScript为检查表单而生,创造它的首要目标是操作DOM,所以JavaScript的操作大多是异步的。

    异步,A和B任务的交付顺序和安排顺序无关。    

3.Promise详解

promise

    Promise是一个代理对象,它和原先要进行的操作并无关系。

    它通过引入一个回调,避免更多的回调。

    Promise 有3个状态:

            pending【待定】初始状态

            fulfilled【实现】操作成功

            rejected【被否决】操作失败

      当Promise状态发生改变,就会触发.then()里的响应函数处理后续步骤。

       Promise状态如果已经改变,不会再变。

4. .then()

        .then()接受两个函数作为参数,分别代表fulfilled和rejected

        .then()返回一个新的Promise实例,所以它可以链式调用

        当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行。

        状态响应函数可以返回新的Promise,或其它值(不返回也可以,我们默认返回一个空)

        如果返回新的Promise,那么下一级.then()会在新的Promise状态改变之后执行。

        如果返回其它任何值,则会立刻执行下一级.then()

5. .then()里有.then()的情况

        因为.then()返回的还是Promise实例

6.错误处理

        Promise会自动捕获内部异常,并交给rejected响应函数处理  

        错误处理的两种做法:

        1.reject(‘错误信息’).then(null.message = > {})

        2.throw new Error('错误信息').catch(message = > {})

        3.推荐使用第二种,更加清晰好读,并且可以捕获前面的错误。

7.catch() + .then()

        强烈建议在所有队列最后都加上。catch(),以避免漏掉错误处理造成意想不到的问题。

8.Promise常用的函数

        1.Promise.all()

                Promise.all([p1,p2,p3,....])用于将多个Promise实例,包装成一个新的Promise实例。返回的实例就是普通Promise

                它接受一个数组作为参数,数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变。

                当所有子Promise都完成,该Promise完成,返回值是全部值的数组

                有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果

      Promise.all()最常见就是和.map()连用。

   实现队列

        使用.forEach()

                常见错误:没有爸.then()产生的新Promise实例赋给promise,没有生成队列。

        使用.reduce()

                常见错误:Promise实例创建之后,会立刻运行执行代码,所以这个也无法达成队列效果。

    

        2.Promise.resolve()

        返回一个fulfilled的Promise实例,或原始Promise实例。

                参数为空,返回一个状态为fulfilled的Promise实例

                参数是一个跟Promise无关的值,同上,不过fulfuilled响应函数会得到这个参数

                参数为Promise实例,则返回该实例,不作任何修改。

                参数为thenable,立刻执行它的.then()    

        3.Promise.reject()

        返回一个rejected的Promise实例

                Promise.reject()不认thenable      

        4.Promise.race()

        类似Promise.all(),区别在于,它有任意一个完成,就算完成。

         常见用法:

                把异步操作和定时器放在一起,如果定时器按时触发,就认为超时,告知用户。

9.现实中的Promise

        1.把回调包装成promise最为常见。它有两个显而易见的好处:

                可读性更好

                返回的结果可以加入任何Promise队列

        2.把任何异步操作包装成Promise

                假设需求:

                        用户点击按钮,弹出确认窗体

                        用户确认和取消有不同的处理

                        样式问题不能使用window.conform()

10.jQuery

        jQuery已经实现了Promise。

11.兼容问题

如果需要在IE中使用Promise,有两个选择:

        只想实现异步队列:jQuery.defered

        需要兼容所有平台:Bluebird 或Promise polyfill

12.Fetch API

        更强大,也更友好。

        直接返回一个Promise实例。   

13.async/await

    ES2017新增运算符,新的语言元素。

        赋予JavaScript以顺序首发便携异步脚本能力

        既保留异步运算的无阻塞特性

                

         

    

    


    

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

推荐阅读更多精彩内容

  • 回调地狱 首先有一个需求,如何连续根据函数的依赖关系,实现多个函数的连续调用,而且要在前置函数完成的情况下。例如 ...
    fejavu阅读 750评论 0 3
  • Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函...
    neromous阅读 8,693评论 1 56
  • Promise 是个啥? 马上拿起来了一个有道词典查了一下. 有承诺,保证的意思.很多电影里都有这句台词:I Pr...
    人话博客阅读 611评论 0 50
  • async 函数 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async函数对 ...
    Xyaleo阅读 1,086评论 0 4
  • Promise 是 ES6 推出的另一个用于异步函数回调的构造函数. 它的使用方式大致如下. 一个实际的例子 Pr...
    人话博客阅读 691评论 0 50