promise以及async、await学习总结
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学习总结的更多相关文章
- Promise, Generator, async/await的渐进理解
作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...
- Async/Await 学习与示例
参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- 异步Promise及Async/Await最完整入门攻略
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...
- 异步Promise及Async/Await可能最完整入门攻略
此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
- node.js异步控制流程 回调,事件,promise和async/await
写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...
- 异步操作之 Promise 和 Async await 用法进阶
ES6 提供的 Promise 方法和 ES7 提供的 Async/Await 语法糖都可以更好解决多层回调问题, 详细用法可参考:https://www.cnblogs.com/cckui/p/99 ...
- callback vs async.js vs promise vs async / await
需求: A.依次读取 A|B|C 三个文件,如果有失败,则立即终止. B.同时读取 A|B|C 三个文件,如果有失败,则立即终止. 一.callback 需求A: let read = functio ...
- Callback, Promise和Async/Await的对比
Callback, Promise和Async/Await的对比 Callback Hell getData1(function (data1) { console.log('我得到data1了') ...
随机推荐
- python 列表、字典多排序问题
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/justin051/article/det ...
- Java基础/发起http和https请求
Java中发起http和https请求 一般调用外部接口会需要用到http和https请求. 本案例为:前后端完全分离,前端框架(React+Mobx+Nornj),后端(Go语言). 面临问题:跨域 ...
- IO流 -字符输入输出流,以及异常处理方法
字符输入流 java.io.Reader: 字符输入流的顶层抽象父类 共性的成员方法: int read() 读取单个字符,并返回. int read(char[] cbuf) 将字符读入数组. ab ...
- PHP foreach &$ 引发的bug
在使用foreach &$来更新数据的时候,造成数据被更新掉了 $arr = array(1,2,3,4,5); foreach ($arr as &$row) { $row += 1 ...
- MySQL-第十二篇管理结果集
1.ResultSet 2.可更新的结果集,使用ResultSet的updateRow()方法.
- Java数据结构介绍(线性结构和非线性结构)
数据结构包括:线性结构和非线性结构. 线性结构 数据元素之间存在一对一的线性关系 包括顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的 链式存储的线性表称为链表,链表 ...
- docker添加加速器
通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像.该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker ...
- [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)
[BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...
- Python 中的垃圾回收机制
GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...
- Spark Streaming Transformations
map(func):对DStream中的所有的元素进行func转换生成新的DStream flatMap(func):和map方法类似,先对DStream中的元素进行func运算,然后压平,就是说,如 ...