Promise/async、await帮我们解决了什么

它给我们提供了一种新的异步编程解决方案,同时避免了困扰已久的回调地狱

// 异步的处理可能会产生这样的回调地狱(第二个异步操作和第一个异步的结果有关系)
let Ajax = function(data, success, error){
$.ajax({
data: data,
success: function(res){
success(res)
},
error: function(err){
error(err)
}
})
}
Ajax(data,function(res){
Ajax(data,function(res){
// 继续循环回调
},function(err){})
},function(err){})
// 看看promise的处理方式
let promise = function (data) {
return new Promise((resolve,reject) => {
$.ajax({
data: data,
success: function(res){
resolve(res)
},
error: function(err){
reject(err)
}
})
})
}
let data = {} // ajax请求参数
promise(data).then((res) => {return promise(res)}).catch(err => console.log(err)).then(res => console.log(res))
// async 、await的处理方式使得异步操作更方便
(async function(){
let res = await promise(data)
let resp = await promise(res)
console.log(resp)
})()

Promise的方法总结

Promise.prototype.then()

Promise.prototype.catch()

Promise.prototype.finally()

Promise.all()

# 当存在多个没有相关性的异步操作时想一次性得到所有结果,可以使用promise.all()
Promise.all([p1,p2,p3])
只有当所有异步操作状态变为resolve的时候
返回所有值得数组
当有一个返回reject的时候
返回值为第一个reject的值

Promise.race()

# 当存在多个没有相关性的异步操作时,想要获得返回速度最快的异步操作采用
Promise.race([p1,p2,p3])
该方法返回第一个有返回值的异步操作的返回值(resolve或者reject)
Promise.race([new Promise((resolve, reject) => {
console.log('init p1')
setTimeout(()=>{
console.log('init p1 +')
resolve('p1')
},2000)
}),new Promise((resolve, reject) => {
console.log('init p2')
setTimeout(()=>{
console.log('init p2 +')
resolve('p2')
},1000)
})]).then(res=>{console.log(res)})
使用场景:设定一个请求的超时时间
Promise.race([new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('1')
},2000)
}),new Promise((resolve,reject)=>{
setTimeout(()=>{
reject(new Error('time out'))
},1000)
})]).then((res=>console.log(res)))

Promise.resolve()

Promise.resolve('111').then(res=>console.log(res))

Promise.reject()

Promise.reject('err').catch(res=>console.log(res))

Promise.try()[目前只是一个提案]

# 【使用时机】对于一个方法如果不知道是同步异步方法,但是想要用then来做后续操作,同时希望同步方法同步执行,异步方法异步执行。
# 等价方案
(async () => f())()
.then(res=>console.log(res))
.catch(err=>console.log(err))

async需要注意什么

错误的捕获

const f = () => console.log('now')
(async () => f())()
# async 会吃掉f()的错误,可以通过promise.catch()来捕获
(async () => f())()
.then(res=>console.log(res))
.catch(err=>console.log(err))

参考

Promise
async/await

最新文章

  1. 20Mybatis_订单商品数据模型_一对一查询——resultType和resultMap两种方式以及两种方式的总结
  2. Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw
  3. FPGA位宽的转换和定义
  4. Log4Net详细配置
  5. 《sqlite权威指南》读书笔记 (一)
  6. Codeforces 427D Match & Catch(后缀自动机)
  7. LINQ 的查询_联表、分组、排序
  8. 使用Spring构建RMI服务器和客户端
  9. 浏览器端类EXCEL表格插件 - 智表ZCELL产品V1.0.0.1版本发布
  10. oracle listener.ora文件配置
  11. CentOS7搭建配置SVN服务器
  12. js带“.”的对象属性名怎么使用
  13. gson解析json
  14. 原生JS获取地址了参数
  15. 【驱动】USB驱动·入门【转】
  16. 用过Retina视网膜屏幕的笔记本电脑的后果
  17. CentOS7中开机出现end_request:I/O error,dev fd0,sector 0的解决办法
  18. Linux - Ubuntu开启SSH服务
  19. [转] 如何在ie11里使用a连接创建动态下载文件流
  20. Kafka高可用环境搭建

热门文章

  1. selenium元素定位之css选择器
  2. Lucene的步骤
  3. JAVA调用shell脚本利用ansible修改多节点上的redis参数
  4. docker--虚拟化
  5. 非GUI 模式运行 jmeter 压力测试
  6. js获取指定字符后面的字符
  7. Ftp客户端(上传文件)
  8. 使用Tabulator遇到的问题
  9. 优化Nginx并发访问量
  10. HTML5 音频播放