promise的意义和用法
promise
promise 是一个 ES6 的语法,承诺的意思,是一个专门用来解决异步 回调地狱 的问题
回调地狱
当一个回调函数嵌套一个回调函数的时候就会出现一个嵌套结构,当嵌套的多了就会出现回调地狱的情况
比如我们发送三个 ajax 请求
- 第一个正常发送
- 第二个请求需要第一个请求的结果中的某一个值作为参数
- 第三个请求需要第二个请求的结果中的某一个值作为参数
ajax({url: '我是第一个请求',success (res) {// 现在发送第二个请求ajax({url: '我是第二个请求',data: res,success (res2) {// 进行第三个请求ajax({url: '我是第三个请求',data: res2,success (res3) { console.log(res3) }})}})}
}
当嵌套越来越多的时候就可能会像下图一样
当代码成为这个结构以后,已经没有维护的可能了,所以我们要把代码写的更加的艺术一些
就需要用到promise
Promise 是ES6对异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。
Promise 简单说就是一个容器,里面保存着一个尚未完成且预计在未来完成的异步操作。
Promise 是一个构造函数,用来创建一个Promise对象。
Promise对象代表一个异步操作,有三种状态:
- pending(进行中)
- fulfilled(成功)
- rejected(失败)
Promise 对象的状态改变有两种:
- 从 pending 变为 fulfilled
- 从 pending 变为 rejected
一旦状态改变,就不会再变,任何时候都可以得到这个结果。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
var p = new Promise(function(resolve, reject) {// do something ...if (/* 异步操作成功 */){resolve(value);} else {reject(error);}
});
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。
resolve 和 reject 是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve 函数的作用是,将Promise对象的状态从“进行中”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。
reject 函数的作用是,将Promise对象的状态从“进行中”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
p.then(function(value) {// success
}, function(error) {// failure 可选
});
Promise实例的then方法:
第一个参数是resolved状态的回调函数
第二个参数(可选)是rejected状态的回调函数
方法返回的是一个新的Promise实例
function fn1(){return new Promise(function(resolve,reject){setTimeout(function(){resolve('成功')},2000)}) } fn1().then(function(res){console.log(res)return fn1()}).then(function(res2){console.log(res2)})
Promise实例的catch方法:
用于指定发生错误时的回调函数,可以捕获then里面的错误。
var p1 = new Promise(function(resolve, reject) {resolve('成功')})p1.then(function(res) {console.log(res)//成功alertt(123)},function(err) {console.log(err)}).catch(function(e) {console.log(e)//ReferenceError: alertt is not defined at demo04.html:26})
throw new Error(‘出错啦’);
function fn1() {return new Promise(function(resolve, reject) {throw new Error('出错了')})}fn1().then(function(res) {console.log(11)//不执行return fn1()},function(err) {console.log(err)//提示出错了}).then(function(res2) {console.log(22)//22},function(err2) {console.log(err2)//不执行})
Promise.all 可以将多个Promise实例包装成一个新的Promise实例。
1.它接受一个数组作为参数。
2.数组可以是Promise对象,也可以是其它值,只有Promise会等待状态改变。
3.当所有的子Promise都完成,该Promise完成,返回值是全部值的数组。
4.如果有任何一个失败,该Promise失败,返回值是第一个失败的子Promise的结果。
5.如果promise对象有多个时,那么按照书写顺序从左往右执行
var p1=new Promise(function(resolve,reject){resolve(111)
})
var p2=new Promise(function(resolve,reject){// alertt('hello')resolve(222)
})
var p3=new Promise(function(resolve,reject){resolve(333)
})
Promise.all([p2,p1,p3]).then(function (arr){console.log(arr);//222,111,333
},function (error){console.log(error);//alertt is not defined
});
----逆战班
promise的意义和用法相关推荐
- 【转】Hibernate的Generator属性有7种class,本文简略描述了这7种class的意义和用法。...
转自:http://hi.baidu.com/zhang_zhu_1/item/5cfcf1a98b86e88a1410733b [转]Hibernate的Generator属性有7种class,本文 ...
- c语言static. volatile,嵌入式系统C语言重点语法const、volatile、static、堆栈等的意义及用法...
原标题:嵌入式系统C语言重点语法const.volatile.static.堆栈等的意义及用法 在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场. 要点:堆, ...
- EOF的意义及用法(while(scanf(“%d“,n) != EOF))
EOF为结束标志,当缓冲里没有东西或者遇到ctrl+z就结束 每次读取长度及类型%d那指定了 参考文章:EOF的意义及用法(while(scanf("%d",&n) != ...
- duilib各种布局的作用,相对布局与绝对布局的的意义与用法
duilib各种布局的作用,相对布局与绝对布局的的意义与用法 原文 http://blog.csdn.net/zhuhongshu/article/details/38531447 主题 Duili ...
- 计算机网络中tx和fx,100Base-TX/T4/FX以太网意义及用法
100Base-TX/T4/FX以太网意义及用法 活络以太网如今拟定的三种有关传输介质的规范之一,一种是100BASE-TX,别的两种是100BASE-T4.100BASE-FX.咱们将"1 ...
- 12 java中instanceof运算符的意义和用法
java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...
- C语言中反斜杠“\“的意义和用法
在阅读C语言代码经常可以看到代码中出现反斜杠"",不是很明白它的意思,遂对反斜杠""的意义和用法进行查询和总结记录: 转义字符 非常常用的一种用法,在反斜杠后面 ...
- 俄语入门-6格的意义和用法
第一格的意义和用法: 1. 用作主语:也就是说,主语是一格.例如:Китай----наша великая родина 中国----我们伟大的祖国.(其中中国是句子的主语) 2. 用作为与的组成部 ...
- python各种常用符号的意思_写一篇专门介绍python中各种符号的意义及用法
挖槽,小米今天上市就破发了,好多认购的小伙伴有点慌了,其实对于小帅b来说这很正常,没必要慌,保持持有就好了,相信小米会越来越牛逼的.小米和可能会成为互联网新一代的霸主主一,到时候可能就不是BAT了,而 ...
- enumerate意义与用法
enumerate意义与用法 names = ["Alice","Bob","Carl"] for index,value in enume ...
最新文章
- iPhone开发技巧之工具篇(4)--- 使用afconvert转换WAV文件
- Java基础之一组有用的类——生成日期和时间(TryDateFormats)
- DSOframer注册使用说明
- Django 02 url路由配置及渲染方式
- 负责域名解析的DNS服务
- 鸿蒙济判法讲义,2020-02-09《薛兆丰经济学讲义》读书笔记
- geoserver 3_使用GeoServer 和 mapbox-gl 搭建离线地图服务
- 20道必须掌握的C++面试题
- 青州市2021年高考成绩查询,2021年青州市高考状元名单资料,今年青州市高考状元多少分...
- kali破解wifi密码
- Debian 10 使用 rz sz 命令
- Unity Panel 控件
- 傅立叶变换变换matlab,希尔伯特变换和傅里叶变换MATLAB仿真
- 《蔡康永的说话之道》-[中]蔡康永
- 【原创】登录和注册页推荐 尊重原创 记得点赞
- 处理数据库镜像问题的一个案例——数据库主体与镜像断开连接
- 水星路由器登录界面找不到服务器,水星路由器管理页面怎么登陆不进去? | 192路由网...
- 【C++】揭开“引用”的庐山真面目
- Java 当前日期判断节假日
- 用scc-loader实现模块化css编程