async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。
await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。
function doubleAfter2seconds(num){
return new Promise((resolve,reject) => {
setTimeout(() => {
return resolve(2 * num)
},2000)
})
}
doubleAfter2seconds(30).then((s) => {
console.log(s)
})
console.log(doubleAfter2seconds(40)) //返回Promise
async function testResult(){
let result = await doubleAfter2seconds(30);
console.log(result)
}
//现在我们看看代码的执行过程,调用testResult 函数,它里面遇到了await,await 表示等一下,
//代码就暂停到这里,不再向下执行了,它等什么呢?等后面的promise对象执行完毕,
//然后拿到promise resolve 的值并进行返回,返回值拿到之后,它继续向下执行。
//具体到我们的代码, 遇到await 之后,代码就暂停执行了, 等待doubleAfter2seconds(30) 执行完毕,
//doubleAfter2seconds(30) 返回的promise 开始执行,2秒 之后,
//promise resolve 了, 并返回了值为60, 这时await 才拿到返回值60,
//然后赋值给result, 暂停结束,代码才开始继续执行,执行 console.log语句。
async function fun(){
let a = await 1;
let b = await new Promise((resolve,reject)=>{
setTimeout(function(){
resolve('setTimeout')
},2000)
})
let c = await function(){
return 'function'
}()
let d = await new Promise((resolve,reject)=>{
setTimeout(function(){
resolve('ddddd')
},2000)
})
console.log(d)
console.log(a,b,c)
}
fun();
控制台立即输出
2s后控制台输出
4s后控制台输出
函数异步,不影响其他函数的执行,但是内部的await则需要按顺序同步执行,fun的执行需要4s不影响上述函数doubleAfter2seconds的执行2s,所以网页运行后2s输出doubleAfter2seconds的值,但是4s才输出fun的值.