es6的async, await使用方法及执行机制
es6的async, await使用方法及执行机制
async/await其实就是promise和generator的语法糖:
async function demo01() {
console.log(1)
return ‘demo1’;
}
demo01().then(function(a){
console.log(a)
});
输出结果为1,demo1
async用来表示函数是异步的,定义的函数会返回一个promise对象,可以使用then方法添加回调函数。上列代码中的async函数中的console.log(1)可以当一个同步的队列执行,也就是说但你在定义async function的时候 里面的代码是以同步的方式执行,只不过async的返回是一个promise,可以用.then()的方式去执行回调,如同上述内容。若 async 定义的函数有返回值,return ‘demo1’;相当于Promise.resolve('demo1’),没有声明式的 return则相当于执行了Promise.resolve();
await是和async一起来使用:
async function demo2(){
console.log(7)
await a()
console.log(6)
}
demo2()
function a() {
console.log(‘demo2’)
}
await 后面可以跟任何的JS 表达式。虽然说 await 可以等很多类型的东西,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。如果await的是 promise对象会造成异步函数停止执行并且等待 promise 的解决,如果等的是正常的表达式则立即执行。
当他和promise一起用的话:
async function demo2(){
console.log(7)
await a()
await new Promise(function(resolve, reject){
console.log(1)
resolve(‘promise’)
})
console.log(6)
}
demo2()
function a() {
console.log(‘demo2’)
}
上述的代码中返回的结果是 7,demo2,1,6。仔细观察是不感觉await和generator的用法很像。同时在用await返回promise的时候,他会默认直接执行promise的resolve,并将其加入微任务队列。
在错误处理的时候需要用try catch来实现:
function sleep(second) { return new Promise((resolve, reject) => { setTimeout(() => { reject('want to sleep~'); }, second); }) } async function errorDemo() { let result = await sleep(1000); console.log(result); } errorDemo();// VM706:11 Uncaught (in promise) want to sleep~ // 为了处理Promise.reject 的情况我们应该将代码块用 try catch 包裹一下 async function errorDemoSuper() { try { let result = await sleep(1000); console.log(result); } catch (err) { console.log(err); } } errorDemoSuper();// want to sleep~ // 有了 try catch 之后我们就能够拿到 Promise.reject 回来的数据了。
面试题
async function demo01() { console.log(1) return 'demo1'; } console.log('0') demo01().then(function(a){ console.log(a) }); console.log('8') async function demo2(){ console.log(7) await a() console.log(6) } demo2() let promise = new Promise(function(resolve, reject){ resolve(5) console.log(3) setTimeout(function(){console.log(4)}) }) console.log(2) promise.then(function(a){ console.log(a) }) function a(){ console.log('demo2') }
结果为
- await和async的使用方法
- 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读
- 使用多线程机制异步执行业务方法
- 使用SpringMVC @Async异步执行方法的笔记 (转载)
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
- ES6 Promise 和 Async/await的使用
- 使用Spring @Async异步执行方法的笔记
- Thread,ThreadPool,Task, 到async await 的基本使用方法和理解
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- React/Redux应用使用Async/Await的方法
- node-使用promise, generator, async/await 读取文件的方法
- .NET/C# 使用async和await关键字调用异步方法
- .NET 4.5 使用async和await关键字调用异步方法
- 使用Spring @Async异步执行方法的笔记
- 【转】.NET 4.5 使用async和await关键字调用异步方法
- 使用async和await将同步方法包装成异步方法
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- ie兼容es6,ie兼容ES6的方法,包括箭头函数,Promise,async,await
- 使用async 和 await方法来
- 使用async await 封装 axios的方法