async {
await a()
await b()
c()
d()
}
这四个方法的执行顺序是怎样的呢?
是 先 a() 再 b() 后 c(),d() ?
还是 先 c(),d() 再 a() 后 b() ?
async {
await a()
await b()
c()
d()
}
这四个方法的执行顺序是怎样的呢?
是 先 a() 再 b() 后 c(),d() ?
还是 先 c(),d() 再 a() 后 b() ?
function a() {console.log('a')}
function b() {console.log('b')}
function c() {console.log('c')}
function d() {console.log('d')}
const request = async() => {
await a()
await b()
c()
d()
}
request()
在console执行上述代码,最终结果是'a','b','c','d',看来是我一开始的理解不太正确,async/await自己将同步代码和异步代码放在一起处理了,刚刚翻译了一篇关于async/await的文章,大家可以阅读了解下。
答案:abcd,但会跳来跳去。先执行a()
,等到a
执行完就跳出async
,执行后续程序,执行完,如果之前a
返回了promise
,就要等它resolve
,如果没有promise
就直接执行async
后续的,也就是b
,b()
过程同a()
,之后cd是同步的,按顺序执行。
原因:async
函数是为了实现异步的,也就是让出线程让其他代码运行,await
就是一个要处理器让出线程的标记,await
后面的函数会先执行一遍,然后跳出async
执行其他(要看await后面的是不是异步promise
),然后再执行async
例子:可以切换promise看看
function sleep(ms, tag){
console.log(performance.now())
console.log('func',tag,'start')
var end = new Date().getTime() + ms
while (true){
if(end <= new Date().getTime()) break
}
console.log('func',tag,'end')
}
function sleepPromise(ms,tag) {
console.log(tag,'start')
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function test(){
await sleep(1000, 'a')
// await sleepPromise(1000,'a')
await sleep(1000, 'b')
// await sleepPromise(1000,'b')
sleep(1000, 'c')
sleep(1000, 'd')
}
console.log(performance.now())
test()
console.log('after test') // a执行完之后运行
sleep(1000, 'wait to test b start')
setTimeout(function(){console.log('after b')}, 1000) //看b是不是异步promise,不是的话要到最后才执行
注意,第一个await
是一定会跳出async
的,但后面的await
如果没有返回promise
,就会被内部转成promise
,并立即resolve(retrunValue)
,因而不会跳出async
。(这段可能不太准确)
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
如果x是Promise, 表達式
await x
在 x fulfill 時才 "返回".等價於