async 函数是和promise配合在一起使用的,意义在于让异步代码看起来和同步代码是一样的。
async 函数返回的是一个 Promise 对象
await只能放在async函数里
定义一个函数,三秒钟之后输出 3 ,输出完 3 之后,再过一秒输出 2 ,再过一秒输出 3
function printNum(time, num){
return new Promise(reslove => {
setTimeout(() => {
console.log(num)
reslove();
},time)
})
}
printNum(3000,3)
printNum(2000,2)
printNum(1000,1)
//执行结果 1,2,3
即使将异步任务用promise容器包起来,但是他仍然是异步执行的从运行结果可以看出虽然先调用的是3 ,
但是他却先执行的是1, 如果想让他依次执行我们可以借助 es6的.then() 还可以使用es7的 async 和 await
链式调用 .then()
function printNum(time, num) {
return new Promise(reslove => {
setTimeout(() => {
reslove(num);
}, time)
})
}
printNum(3000,3).then(res=>{
console.log(res)
return printNum(2000,2)
}).then(res=>{
console.log(res)
return printNum(1000,1)
}).then(res=>{
console.log(res)
})
这时候我们用 async 和 await 我们看一下结果
function printNum(time, num){
return new Promise(reslove => {
setTimeout(() => {
console.log(num)
reslove();
},time)
})
}
async function run(){
await printNum(3000,3)//当此函数执行完,再调用下一个以 await 修饰的函数
await printNum(2000,2)//当此函数执行完,再调用下一个以 await 修饰的函数
await printNum(1000,1)//当此函数执行完,再调用下一个以 await 修饰的函数
}
run()
我们可以看到三秒钟之后输出 3,再过两秒输出 2,再过一秒输出 1
其实是和promise的 then 方法是如出一辙的
async await还有一个作用就是 以 await 修饰的函数的返回值就是成功reslove()回调里面的数据
我们可以将代码修改为如下形式
function printNum(time, num){
return new Promise(reslove => {
setTimeout(() => {
reslove(num);
},time)
})
}
async function run(){
// 一秒后打印1
let num1 = await printNum(1000, 1);
console.log(num1);
// 两秒后打印2
let num2 = await printNum(2000, 2);
console.log(num2);
// 三秒后打印3
let num3 = await printNum(3000, 3);
console.log(num3);
}
//执行结果1,2,3
run();
如果async函数里面有return 将会被.then()方法接受
如果reject()失败将不会执行return 返回reject()被.catch()方法接受
async函数会返回一个promise,并且Promise对象的状态值是resolved(成功的)
如果你没有在async函数中写return,那么Promise对象resolve的值就是是undefined
async function printNum() {
// await Promise.resolve("hello worl") ===> undefined
// await Promise.reject("失败") ===> 失败
return "hello world" ===> hello world
}
printNum().then(e=>console.log(e)).catch(v=>console.log(v))