参考资料传送门:戳一戳

1、是什么

  Promise是异步编程的一种解决方案,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败);

一般成功了状态用resolved表示,失败用rejected表示。

Promise的返回值也是一个promise,会携带状态函数和函数带的参数,可进行链式操作new Promise(()=>{}).then(()=>{}).catch(()=>{});

注意:then()的返回值是新的promise,如果then执行了,catch是不会执行的,因此then可以由很多个,catch只有一个,中间有什么错误都会在catch抛出

2、为什么

  为了让代码按照自己想要的执行过程进行渲染,比较多的是考虑到用ajax加载页面内容时dom元素未渲染完毕,javascript就加载完毕的,效果挂不到页面上的情况。

3、怎么做

  (1)新建:2种方式

   

     <script>
console.log(1);
const p1 = new Promise(function (resolve, reject) {
console.log(2);
}) p1.then(()=>{console.log(3);}) </script> <script>
console.log(4);
</script>
<script>
function p(){
return new Promise((resolved,rejected)=>{
if(true){
console.log(2);
resolved(6);
}else rejected(5);
});
n.then((val)=>{
//所有的都执行后再执行?!
console.log(3);
console.log(6);
})
console.log(4);
}
//p();
</script>

  

    注意 第一个script片段的输出是1243,在then里面是输出3,这个代表浏览器会在当前脚本所有同步任务执行完才会执行then里面的回调函数,当前脚本是指同一个js文件或者同一个script标签内部。

  (2)关于resolve,reject,then的使用

总结:resolve和reject的返回决定then调用哪个函数,然后可以带参数到then中

 function timeout(ms) {
//new 一个promise对象,两个形参es6自动创建的,当里面的匿名函数执行成功,再调用resolve(),会执行then后面成功回调函数,失败的话是执行then后面的失败函数
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
//代码执行成功则会调用resolve()
//失败调用reject()
});
}
//调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误
//reject(new Error(this.statusText));
timeout(100).then(("成功后执行的回调函数") => { console.log(value);
 },("失败后执行的回调函数")=>{"我是执行失败的回调函数"}});
<script>
console.log(1);
const n=new Promise((resolved,rejected)=>{
if(true){
console.log(2);
resolved(6);
}else rejected(new Error(5));
});
n.then((val)=>{
//所有的都执行后再执行?!
console.log(3);
console.log(val)
})
console.log(4);
/*结果是12436*/
</script>

  (3)then与catch

  总结:如果then里面有写reject,则有错误会在then阶段抛出,如果没有写,就会把错误都统一用catch抛出

  

 //第一种
const p1=new Promise((resolve,reject)=>{
//resolve(1);
reject(0);
})
p1.then((result)=>{console.log("then_"+result)},
(result)=>{console.log("then_"+result)}) //第二种
const p1=new Promise((resolve,reject)=>{
//resolve(1);
reject(0);
})
p1.then((result)=>{console.log(result)})
.catch((result)=>{console.log("cathc_"+result)})

  下面代码执行过程

  ***程序执行流程是

  p1是第一个新建的promise对象,会立马执行,然后在3s后抛出一reject,在这个等待的过程中,p2会执行,然后在1s后抛出resolve(p1),由于p2值是另外一个p1,在2s后p2的指向是p1,p1的回调函数reject,所以执行catch的error函数,promise的返回值是一个promise对象

<script>
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('222')), 3000)
}) const p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
//所以最终p2返回的内容promise对象是p1
p2
.then(result => console.log(result))
.catch(error => console.log("111")) </script>

(4)注意,调用resolvereject并不会终结 Promise 的参数函数的执行。即使代码resolve写在最前面,也不会终止里面代码的执行,如果需要执行resolve后不执行后面的语句需要利用return来打断代码执行

(5)Promise.prototype.finally() 

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。

(6)promise.all()

里面可以写一个数组,如果是promise对象的数组,则如果对象全市完成all才会返回完成,只要有一个失败就会转回失败

4.小缺点

首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

es6中,promise使用过程的小总结的更多相关文章

  1. ES6中Promise对象个人理解

    Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...

  2. 对于ES6中Promise的个人见解

    1.js中常见的异步 JavaScript可以响应用户的一些异步交互,比如单击鼠标和按键盘等操作. let button = document.getElementById("btn&quo ...

  3. ES6中promise的使用方法

    先看看ES5中异步编程的使用. let ajax = function (callBlack) { setTimeout(function () { callBlack && call ...

  4. ES6中promise总结

    一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...

  5. ES6中Promise的入门(结合例子)

    一.Promise的前言 解决回调地狱 //以往回调方式 函数1(function(){ //代码执行...(ajax1) 函数2(function(){ //代码执行...(ajax2) 函数3(f ...

  6. ES6 中 Promise

    在说Promise之前我们先简单说一下什么是同步异步? 同步(Sync):所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作. 异步(Async):异步与同步相对, ...

  7. ES6 中 Promise 详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Promise 提供统一的 API ...

  8. ES6中Promise详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 AP ...

  9. 阿里前端测试题--关于ES6中Promise函数的理解与应用

    今天做了阿里前端的笔试题目,原题目是这样的 //实现mergePromise函数,把传进去的数组顺序先后执行,//并且把返回的数据先后放到数组data中 const timeout = ms => ...

随机推荐

  1. fiddler---Fiddler查看get和post请求

    前几篇写了Fiddler的一些功能介绍,今天我们一起学习下如何通过fiddler查看get请求和post请求和get,post区别 get请求 1.启动fiddler,抓取安静博客地址 2.通过fid ...

  2. itest(爱测试) 4.1.5 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    v4.1.5下载地址 :itest下载 itest 简介:查看简介 itest 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试 ...

  3. STP配置和选路规则

    1.用四台S3700交换机,2台PC机,组建网络拓扑 2.对mengyu-S1进行设置 (1)在交换机启用生成树(华为交换机默认启用MSTP),将交换机的STP模式更改为普通生成树STP: (2)配置 ...

  4. IntelliJ IDEA常用配置(三)

    提示:对于一些通用的设置可以配置成全局的. 1. 主题配置 File - Settings - Color Scheme,默认的是Default(一个白色主题),Darcula是一个黑色主题. 我们也 ...

  5. NN tutorials:

    确实“人话”解释清楚了 ^_^ 池化不只有减少参数的作用,还可以: 不变性,更关注是否存在某些特征而不是特征具体的位置.可以看作加了一个很强的先验,让学到的特征要能容忍一些的变化.防止过拟合,提高模型 ...

  6. vue better-scroll

    better-scroll在vue项目中的使用 2017年12月21日 18:01:09 阅读数:411 1.准备工作 在项目中安装better-scroll: npm install --save ...

  7. [RN] React Native 调试技巧

    React Native 调试技巧 一. 安卓模拟器调出Dev Setting 命令 adb shell input keyevent 二.图片不出来时,先运行此命令,再重新 run react-na ...

  8. 教你用好 Javascript 数组

    原文链接:https://juejin.im/post/5d9769b26fb9a04df26c1b89 作为 Javascript 的标准对象之一,数组是非常底层而且实用的数据结构.虽然结构很简单, ...

  9. 第01组 Beta版本演示

    目录 1.1 本组成员 1.2 工作流程.组员分工.组员工作量比例 1.3 GitHub 项目链接 1.4 本组 Beta 冲刺站立会议博客链接汇总 1.5 燃尽图 1.6 原计划.达成情况及原因分析 ...

  10. 解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题

    解惑:如何使用SecureCRT上传和下载文件.SecureFX乱码问题 一.前言 很多时候在windows平台上访问Linux系统的比较好用的工具之一就是SecureCRT了,下面介绍一下这个软件的 ...