promise的使用

promise的作用

参考:https://www.imooc.com/learn/949
它是一个 代理对象,它和原生要进行的操作并没有关系,它引入一个回调,避免了多个回调。
-用于异步计算
-将异步操作队列化,按照预期顺序执行,返回符合预期的结果
-可以在对象之间传递promise,帮助我们处理队列

1.promise说明

new Promise(
      //它是一个执行器
      function(resolve, reject){
            //将要耗时的异步操作放在此函数中执行
           resolve();    //成功调用此函数,表示数据处理完成
            reject();      //数据处理出错,调用reject
     }
).then(function A(){
      //如果调用了resolve(),则调用第一个方法A()
}, function B(){
        //如果调用了 reject(),则调用B()
});

2.promise有三个状态

pending 初始化状态
fulfilled 操作成功
rejected 操作失败

当状态发生改变,就会触发 .then()里的响应函数处理后面的事情。
promise状态一经改变,不会再变。

3.promise的then()

promise执行每个then()时,都会返回一个新的promise实例
当执行完一个then()后,会从队列出取出下一个继续执行。

-状态响应函数可以返回新的promise或其它值
-如果返回新的promise,那么下一级 then()会在新的promise状态改变之后执行
-如果返回其他任何值,则会立即执行下一级then()

4.如果在then()中不返回promise会怎么样

如果在then()中不返回promise或者不返回任何东西,则默认执行下一个then()

5.错误处理

promise在执行器中执行时,如果捕获到异常,会将promise标记为
rejected状态,并交给rejected()函数进行处理,也会寻找catch进行处理。

推荐在所有then()的后面通过catch来捕获所有异常处理错误的方法。

6.在catch 后调用then()会怎么样

catch也会返回promise实例,如果catch执行完没有rejected,后面如果有then(),会继续执行完。如果catch执行完有异常出现,则会跳过后面的then,如果在catch后面还有catch,则还会执行catch后面的catch。

7.promise的函数

promise.all([p1,p2,....])接受一个数组作为参数,会返回一个新的promise实例。
数组可以是promise或其他值,promise会等待执行完成,当所有promise都完成,返回值是全部值的数组。

有任何一个失败,该promise失败,返回值是第一个失败的子promise的值。

8.promise.resolve()

作用:返回一个fulfilled的promise实例或原始的promise
分为以下几种情况
-参数为空时,返回一个状态为fulfilled的promise实例
-参数是一个跟promise无关的值,返回一个状态为fulfilled的promise实例,同时promise函数会得到这个参数
-参数为promise实例,则返回该实例,不作任何修改
-参数为thenable,则会立刻执行它的then()函数

9.promise.reject()

返回一个rejected的promise实例
-promise.reject()不认thenable
-其他与resolve()类似

10.promise.race()

与promise.all()类似
不同在于它有任意一个完成就算完成,不等待所有都完成。
常见用法:
把异步操作和定时器放在一起,如果定时器先触发,则知道超时,提示用户。

11.开发中的用法

将异步包装成promise
所有返回结果生成队列,用于其他地方

12.开发实战举例

说明:
1.有一个表单,表单中有多个附件,提交表单前需要将所有的附件上传,并将所有附件上传返回的id随表单一块提交。
2.附件上传到服务器只能一次上传一个。

这就需要保证所有的附件上传完,并将所有的结果返回后,再提交表单。

思路:
可以为每一个附件上传构建成一个Promise,并使用promise.all()来执行这N个Promise,这样就保证了所有的附件上传都返回了结果。
-如果所有附件上传成功了,下一步可以提交表单。
-如果promise.all()返回的结果有上传附件失败的情况,可以提示用户有某个附件未上传成功,是否继续提交表单。

let promises=[]; //存放所有的附件上传promise

//fileList为保存附件的数组,根据附件文件数,创建多个promise
 this.fileList.forEach(item=>{

             this.formData = new FormData();
             this.formData.append('file', item);

             let p = new Promise(resolve => {
               this.$http({ //自己实现的上传附件到服务器的方法
                 showModal: true,
                 url: 'xxxxxxxx',
                 method: 'post',
                 data: this.formData,
                 headers: {
                   'Content-Type': 'multipart/form-data',
                   'X-Requested-With': 'XMLHttpRequest',
                 },
               }).then(res=>{
                 resolve(res); //将结果传递,不调用,后面执行Promise.all拿不到结果
               })
             })

             promises.push(p); //将所有的promise存在数组中

           })

Promise.all(promises).then(results=>{

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