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的意义和用法相关推荐

  1. 【转】Hibernate的Generator属性有7种class,本文简略描述了这7种class的意义和用法。...

    转自:http://hi.baidu.com/zhang_zhu_1/item/5cfcf1a98b86e88a1410733b [转]Hibernate的Generator属性有7种class,本文 ...

  2. c语言static. volatile,嵌入式系统C语言重点语法const、volatile、static、堆栈等的意义及用法...

    原标题:嵌入式系统C语言重点语法const.volatile.static.堆栈等的意义及用法 在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场. 要点:堆, ...

  3. EOF的意义及用法(while(scanf(“%d“,n) != EOF))

    EOF为结束标志,当缓冲里没有东西或者遇到ctrl+z就结束 每次读取长度及类型%d那指定了 参考文章:EOF的意义及用法(while(scanf("%d",&n) != ...

  4. duilib各种布局的作用,相对布局与绝对布局的的意义与用法

    duilib各种布局的作用,相对布局与绝对布局的的意义与用法 原文  http://blog.csdn.net/zhuhongshu/article/details/38531447 主题 Duili ...

  5. 计算机网络中tx和fx,100Base-TX/T4/FX以太网意义及用法

    100Base-TX/T4/FX以太网意义及用法 活络以太网如今拟定的三种有关传输介质的规范之一,一种是100BASE-TX,别的两种是100BASE-T4.100BASE-FX.咱们将"1 ...

  6. 12 java中instanceof运算符的意义和用法

    java中instanceof运算符的意义和用法 instanceof运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来标识该对象是否为特定类或者它的子类的一 ...

  7. C语言中反斜杠“\“的意义和用法

    在阅读C语言代码经常可以看到代码中出现反斜杠"",不是很明白它的意思,遂对反斜杠""的意义和用法进行查询和总结记录: 转义字符 非常常用的一种用法,在反斜杠后面 ...

  8. 俄语入门-6格的意义和用法

    第一格的意义和用法: 1. 用作主语:也就是说,主语是一格.例如:Китай----наша великая родина 中国----我们伟大的祖国.(其中中国是句子的主语) 2. 用作为与的组成部 ...

  9. python各种常用符号的意思_写一篇专门介绍python中各种符号的意义及用法

    挖槽,小米今天上市就破发了,好多认购的小伙伴有点慌了,其实对于小帅b来说这很正常,没必要慌,保持持有就好了,相信小米会越来越牛逼的.小米和可能会成为互联网新一代的霸主主一,到时候可能就不是BAT了,而 ...

  10. enumerate意义与用法

    enumerate意义与用法 names = ["Alice","Bob","Carl"] for index,value in enume ...

最新文章

  1. iPhone开发技巧之工具篇(4)--- 使用afconvert转换WAV文件
  2. Java基础之一组有用的类——生成日期和时间(TryDateFormats)
  3. DSOframer注册使用说明
  4. Django 02 url路由配置及渲染方式
  5. 负责域名解析的DNS服务
  6. 鸿蒙济判法讲义,2020-02-09《薛兆丰经济学讲义》读书笔记
  7. geoserver 3_使用GeoServer 和 mapbox-gl 搭建离线地图服务
  8. 20道必须掌握的C++面试题
  9. 青州市2021年高考成绩查询,2021年青州市高考状元名单资料,今年青州市高考状元多少分...
  10. kali破解wifi密码
  11. Debian 10 使用 rz sz 命令
  12. Unity Panel 控件
  13. 傅立叶变换变换matlab,希尔伯特变换和傅里叶变换MATLAB仿真
  14. 《蔡康永的说话之道》-[中]蔡康永
  15. 【原创】登录和注册页推荐 尊重原创 记得点赞
  16. 处理数据库镜像问题的一个案例——数据库主体与镜像断开连接
  17. 水星路由器登录界面找不到服务器,水星路由器管理页面怎么登陆不进去? | 192路由网...
  18. 【C++】揭开“引用”的庐山真面目
  19. Java 当前日期判断节假日
  20. 用scc-loader实现模块化css编程

热门文章

  1. ROS:launch规范及用法
  2. 英语流利说19秋招笔试总结
  3. dnfdpl服务器维护了,扶持青年学者 商务印书馆将推出“日新文库”
  4. 单片机学习(三)8位数码管显示8个字符的程序及详解
  5. 崇明东平森林公园一日游
  6. 按月统计的sql语句
  7. 【老生谈算法】matlab实现自适应Simpson积分算法源码——积分算法
  8. 首届全国智能制造(中国制造2025)创新创业大赛在京启动
  9. Sublime Text2 好用技巧备忘
  10. js 时区对应的时间转换