await和async使用方法vuemethodsasyncawait异步函数
async:作为⼀个关键字放到函数之前,表⽰函数是异步的函数,因为async就是异步的意思, 异步函数也就意味着该函数的执⾏不会阻塞后⾯代码的执⾏,async 函数返回的是⼀个promise 对象
async的⽤法,它作为⼀个关键字放到函数前⾯
async function timeout(){
  return'hello world';
}
只有⼀个作⽤, 它的调⽤会返回⼀个promise 对象。调⽤⼀下看看就知道了,怎么调⽤?async 函数也是函数,所以它的调⽤和普通函数的调⽤没有什么区别,直接加括号调⽤就可以了,为了看结果,console.log ⼀下
async function timeout(){
return'hello world'
}
console.log(timeout());
async函数(timeout)的调⽤,确实返回promise 对象,并且Promise 还有status和value,如果async 函数中有返回值 ,当调⽤该函数时,内部会调⽤Promise.solve() ⽅法把它转化成⼀个promise 对象作为返回, 但如果timeout 函数内部抛出错误呢?
async function timeout(){
throw new Error('rejected');
}
console.log(timeout());
就会调⽤ject() 返回⼀个promise 对象,
那么要想获取到async 函数的执⾏结果,就要调⽤promise的then 或catch 来给它注册回调函数,
async function timeout(){
return'hello world'
}
timeout().then(result =>{
console.log(result);
})
如果async 函数执⾏完,返回的promise 没有注册回调函数,⽐如函数内部做了⼀次for 循环,你会发现函数的调⽤,就是执⾏了函数体,和普通函数没有区别,唯⼀的区别就是函数执⾏完会返回⼀个promise 对象。
for(let index =0; index <3; index++){
console.log('async '+ index);
}
}
console.log(timeout());
console.log('outer')
async 关键字差不多了,最重要的就是async函数的执⾏会返回⼀个promise 对象,并且把内部的值进⾏promise的封装。如果promise 对象通过then或catch⽅法⼜注册了回调函数,async函数执⾏完以后,注册的回调函数就会放到异步队列中,等待执⾏。如果只是async,和promise 差不多,但有了await就不⼀样了, await 关键字只能放到async 函数⾥⾯,await是等待的意思,那么它等待什么呢,它后⾯跟着什么呢?其实它后⾯可以放任何表达式,不过我们更多的是放⼀个返回promise 对象的表达式,它等待的是promise 对象的执⾏完毕,并返回结果
await的含义为等待。意思就是代码需要等待await后⾯的函数运⾏完并且有了返回结果之后,才继续执⾏下⾯的代码,同步的效果
现在写⼀个函数,让它返回promise 对象,该函数的作⽤是2s 之后让数值乘以2
// 2s 之后返回双倍的值
function doubleAfter2seconds(num){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(2* num)
},2000);
})
}
现在再写⼀个async 函数,从⽽可以使⽤await 关键字, await 后⾯放置的就是返回promise对象的⼀个表达式,所以它后⾯可以写上doubleAfter2seconds 函数的调⽤
async function testResult(){
let result =await doubleAfter2seconds(30);
console.log(result);
}
testResult();//2秒后输出60
现在看看代码的执⾏过程,调⽤testResult 函数,它⾥⾯遇到了await, await 表⽰等待,代码就暂停到这⾥,不再向下执⾏了,它等待后⾯的promise对象执⾏完毕,然后拿到promise resolve 的值并进⾏返回,返回值拿到之后,它继续向下执⾏。具体到 我们的代码, 遇到await 之后,代码就暂停执⾏了, 等待doubleAfter2seconds(30) 执⾏完毕,doubleAfter2seconds(30) 返回的promise 开始执
⾏,2秒 之后,promise resolve 了, 并返回了值为60, 这时await 才拿到返回值60, 然后赋值给result, 暂停结束,代码继续执⾏,执⾏ console.log语句。
就这⼀个函数,我们可能看不出async/await 的作⽤,如果我们要计算3个数的值,然后把得到的值进⾏输出呢?
async function testResult(){
let first =await doubleAfter2seconds(30);
let second =await doubleAfter2seconds(50);
let third =await doubleAfter2seconds(30);
console.log(first + second + third);
}
6秒后,控制台输出220, 我们可以看到,写异步代码就像写同步代码⼀样了,再也没有回调地域了。
这⾥强调⼀下等待,当js引擎在等待promise resolve 的时候,它并没有真正的暂停⼯作,它可以处理其它的⼀些事情,如果我们在testResult函数的调⽤后⾯,console.log ⼀下,你发现 后⾯console.log的代码先执⾏。
let first =await doubleAfter2seconds(30);
let second =await doubleAfter2seconds(50); let third =await doubleAfter2seconds(30);    console.log(first + second + third);
}
testResult();
console.log('先执⾏');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。