async&await是JavaScript Es7发布的新语法,据说是解决异步编程的终极解决方案。
async 是“异步”的意思,而 await 是等待的意思,await 用于等待一个异步任务执行完成的结果。
async/await 是一种编写异步代码的新方法(以前是采用回调和 promise)。
- async/await 是建立在 promise 的基础上。
- async/await 像 promise 一样,也是非阻塞的。
- async/await 让异步代码看起来、表现起来更像同步代码。
async
- 可以作用在任何方法前, 返回值是一个Promise对象(回调函数也可以使用async)
- 函数内部return的返回值, 会成为then回调函数的参数
- async作用的方法,如果内部出现报错,可以被promise的catch方法捕获
- 常规使用,一般都会通过try catch进行有可能报错的代码处理
let fn2 = async ()=>{
return 1
}
// console.log(fn2());//使用async之后返回Promise对象
fn2().then(res=>{
console.log("fn2.then==>",res)
})
从以上代码可以看到,执行结果一样。Asnyc修饰的函数的返回值会作为resolve对应函数的参数。
await
- await只能作用在async修饰的方法中,不能单独使用,如果使错:await is only valid in async functions and the top level bodies of modules
- await是会阻塞代码执行
- 正常情况 await后面跟着一个Promise对象; 返回的是Promise对象的成功后结果; 如果是一个普通值,那么会直接返回这个值
- reject的返回 await没有办法进行捕获(使用try catch进行捕获)
let p1 = ()=>{
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve("hello world")
},3000)
})
}
async function fn3(){
console.time("step3_1");
let res = await p1();
//使用await之后 像是在写同步代码一样,只有等P1得到结果才会继续向下执行
//await是会阻塞代码执行
console.timeEnd("step3_1");
}
fn3();