Promise详解

/* *  创建Promise实例的时候得传一个函数 executor,并且这个函数接收两个参数+ resolve函数:将实例的状态从 pending 修改为 fulfilled/resolved,同时将实例的值改为执行这个函数时传递的实参+ reject函数:将实例的状态从 pending 修改为 rejected,同时将实例的值改为执行这个函数时传递的实参每一个Promise实例都有两个重要的属性:+ [[PromiseState]] 实例的状态+ pending  初始状态+ 通过new创建实例的时候,没有在executor函数中执行resolve函数,也没有执行reject函数,则创建的实例状态为pending,值为undefined+ 通过 实例1.then() 执行then函数时,没有给then函数传递A函数和B函数,则返回的新实例的状态为pending,值为实例1的结果+ fulfilled/resolved  成功状态+ rejected  失败状态注意:实例的状态是单向改变的,即只能从pending变为fulfilled/resolved,或者从pending变为rejected+ [[PromiseResult]] 实例的结果/值+ undefined 初始值+ 成功的结果/失败的原因
*/let p1 = new Promise((resolve, reject) => {resolve(100);reject(200); // 这里不会执行,因为执行完 resolve(100) 后实例的状态已经从pending改为fulfilled了
});
console.dir(p1); // 状态为 fulfilled,值为 100
/* * 实例可以调用其所属类的原型上的方法,Promise也一样* Promise.prototype上的方法:+ then(A, B):then方法跟executor函数一样,接收两个函数 A和B+ A(res)函数:接收一个参数res,如果当前实例的状态为 fulfilled/resolved 则执行它,且 res 的值为当前实例的结果/值+ B(rej)函数:接收一个参数 rej,如果当前实例的状态为 rejected 则执行它,且 rej 的值为实例的结果/值+ catch+ finally
*/
let p1 = new Promise((resolve, reject) => {resolve(100);
});
let p2 = p1.then(res=>{console.log(res); // 100
}, rej=>{console.log(rej)
}); // 通过 实例.then() 执行then方法之后会返回一个新的 Promise 实例console.log(p2);  //一个新的实例
/* * 执行 实例1.then 函数返回一个新的实例,新的实例2的状态和值怎么确定?+ 实例2的状态:1、如果在执行时没有给then传递A函数和B函数,那实例2的状态为pending2、实例1.then(A,B);不论then中执行的是A函数还是B函数,只要不报错,那实例2的状态就为 fulfilled;如果报错,实例2的状态则为 rejected+ 实例2的结果/值1、如果实例2的状态为 pending,则实例2的值跟实例1的一样2、如果实例2的状态为 fulfilled/resolved,那实例2的值是实例1基于then函数中执行A或执行B返回的结果特殊情况:如果函数A或者函数B中返回的是一个新的Promise实例,那return的实例的状态以及结果,直接决定实例2的状态和结果3、如果实例2的状态为 rejected,那实例2的结果/值就是失败的原因实例1的状态和值也受 executor 函数执行的影响+ 如果执行 executor 函数报错了,则实例的是状态为 rejected,值为报错的原因+ 如果执行 executor 函数没有报错,那要看executor函数中执行的是 resolev函数还是rejecte函数
*/let p1 = new Promise((resolve, reject) => {resolve(100);reject(200); // 这里不会执行,因为执行完 resolve(100) 后实例的状态已经从pending改为fulfilled了
});
console.dir(p1); // 状态为 fulfilled,值为 100let p2 = p1.then(res=>{// return 400;  // 实例p2的状态为 fulfilled,值为 400// 返回一个状态为pending,值为undefined的实例return new Promise(()=>{}); // p2的状态为 pending,值为undefined
}, rej=>{});
/* * Promise作为内置类,也是一个对象,也有自己的私有方法(只能通过Promise.xxx()调用)+ resolve([val]):快速创建一个状态为成功,值为val的实例+ rejecte([val]):快速创建一个状态为失败,值为val的实例+ all():+ race():
*/let p1 = Promise.resolve(100); // p1的状态为 fulfilled,值为 100let p2 = Promise.reject(400); // p2的状态为 rejected,值为 400
/* * then([A],[B]):如果其中一个函数没有传递,则会“顺延”+ [A]没有传递:则找下一个 then 中的 A 函数+ [B]没有传递:则找下一个 then 中的 B 函数
*/// 成功的顺延:如果then中没有传A函数,默认会执行 res=>{return res}Promise.resolve(200).then(null/!* res =>{return res} *!/, rej=>{console.log('我是第一个then中的B函数')
}).then(res=>{console.log('我是第二个then中的A函数', res)
}, rej=>{console.log('我是第二个then中的B函数', rej);// 404
}); // 失败的顺延:如果then中没有传B函数,默认会执行 rej=>{return Promise.reject(rej)}Promise.reject(404).then(res=>{console.log('第一个then中的A函数', res)
},/!* rej=>{return Promise.reject(rej)} *!/).then(res=>{console.log('我是第二个then中的A函数', res)
}, rej=>{console.log('我是第二个then中的B函数', rej);// 404
}); //  catch:等价于 then(null,rej=>{...})
Promise.reject(10).then(res=>{console.log('成功了', res)
}).then(res=>{console.log('我是第二个then')
}).catch(rej =>{console.log('失败了', rej); // 输出  10
});// 真实项目中:then只是处理成功,即只传一个A函数;catch处理失败(传B函数),且通常将catch写在末尾// 返回失败状态的实例,但是没有做失败处理,浏览器控制台有报错(但是不影响其他代码的执行)
/* Promise.reject(10).then(res=>{console.log(res)
}); // 浏览器中会有报错 */// 如果加上catch,哪怕什么都不做,浏览器也不报错了
Promise.reject(10).then(res=>{console.log('成功');
}).catch(rej=>{});  // 不报错了

Promise中的then方法详解相关推荐

  1. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  2. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  3. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  4. php 文件扫描去重,PHP中的去重方法详解和文件下载

    本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...

  5. keep alive PHP,vue中keep-alive使用方法详解

    这次给大家带来vue中keep-alive使用方法详解,vue中keep-alive使用的注意事项有哪些,下面就是实战案例,一起来看一下. 1.keep-alive的作用以及好处 在做电商有关的项目中 ...

  6. java中main是什么_Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  7. session在PHP中的用法,PHP中session使用方法详解

    php中session详解 综述 Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.从上述的定义中我们可以看到,Session实际 ...

  8. android 清空数组缓存,Android数据持久化之读写SD卡中内容的方法详解

    本文实例讲述了Android数据持久化之读写SD卡中内容的方法.分享给大家供大家参考,具体如下: 前面文章里讲的那三个方法:openFileOutput.openFileInput虽然都能通过流对象O ...

  9. java arrays.aslist()_Java中Arrays.asList()方法详解及实例

    Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...

最新文章

  1. 死里逃生!国足2:1逆转泰国队晋级亚洲杯八强
  2. 查找 framework 文件中是否包含 WKWebView
  3. 企业经营私域运营的三大核心系列直播课
  4. arrays中copyof复制两个数组_异或的魅力!图解「数组中两个数的最大异或值」
  5. Azure手把手系列6:存储服务介绍
  6. Angular应用里使用import直接导入到应用代码里的class,在运行时的表现
  7. oracle锁表怎么解决,Oracle锁表问题的简捷处理技巧
  8. 《SpringCloud超级入门》Eureka自我保护模式和InstanceID的配置《十四》
  9. listPageData传jsp隐藏域,在传回java
  10. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传
  11. 土豆英雄抽传说卡程序(非土豆英雄玩家不要看)
  12. 2020年微信视频号数据分析生态趋势调查报告
  13. Vue进阶(贰零陆):Vue 培训课件
  14. 10.4. 嗅探工具
  15. 关于装电脑系统的心得总结
  16. SDNU-1014 页码问题
  17. 13-SQLite之group by
  18. Iphone保存html网页,在iPhone上保存网页的最优方式
  19. 程序员该如何说话?做人?做事?
  20. php 多语言cms,帝国cms模板实现多国语言切换

热门文章

  1. 没有最低只有更低,暴风50吋AI电视1999元预约开启
  2. Redis集群战法整理
  3. 优酷|土豆|56视频自动播放代码在线生成
  4. 章节十三:类与对象1
  5. 蔡勒公式 java,C/C++根据年月日计算星期几(蔡勒公式篇)
  6. 汽车共享领域的春天还有多远?
  7. JS实现json格式美化【工具包系列】
  8. 《五号特工组2》热播 片尾曲被指涉嫌抄袭
  9. uni-app上传图片(选择,预览,删除图片)
  10. NPDP备考攻略来咯!建议收藏