扫码关注官方订阅号
async { await a() await b() c() d() }
这四个方法的执行顺序是怎样的呢?
是 先 a() 再 b() 后 c(),d() ?还是 先 c(),d() 再 a() 后 b() ?
光阴似箭催人老,日月如移越少年。
如果x是Promise, 表達式await x 在 x fulfill 時才 "返回".
await x
等價於
Promise.resolve(a()) .then(() => Promise.resolve(b())) .then(() => { c(); d(); });
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的文章,大家可以阅读了解下。
有await的地方如果是异步则等异步执行完执行下一步 同步则按同步方式执行 其他不变啊 所以abcd啊 只是d不等c异步回调 如果c是异步的话 ?
答案:abcd,但会跳来跳去。先执行a(),等到a执行完就跳出async,执行后续程序,执行完,如果之前a返回了promise,就要等它resolve,如果没有promise就直接执行async后续的,也就是b,b()过程同a(),之后cd是同步的,按顺序执行。
a()
a
async
promise
resolve
b
b()
原因:async函数是为了实现异步的,也就是让出线程让其他代码运行,await就是一个要处理器让出线程的标记,await后面的函数会先执行一遍,然后跳出async执行其他(要看await后面的是不是异步promise),然后再执行async
await
例子:可以切换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。(这段可能不太准确)
resolve(retrunValue)
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
如果x是Promise, 表達式
await x在 x fulfill 時才 "返回".等價於
在console执行上述代码,最终结果是'a','b','c','d',看来是我一开始的理解不太正确,async/await自己将同步代码和异步代码放在一起处理了,刚刚翻译了一篇关于async/await的文章,大家可以阅读了解下。
有await的地方如果是异步则等异步执行完执行下一步 同步则按同步方式执行 其他不变啊 所以abcd啊 只是d不等c异步回调 如果c是异步的话 ?
答案:abcd,但会跳来跳去。先执行
a(),等到a执行完就跳出async,执行后续程序,执行完,如果之前a返回了promise,就要等它resolve,如果没有promise就直接执行async后续的,也就是b,b()过程同a(),之后cd是同步的,按顺序执行。原因:
async函数是为了实现异步的,也就是让出线程让其他代码运行,await就是一个要处理器让出线程的标记,await后面的函数会先执行一遍,然后跳出async执行其他(要看await后面的是不是异步promise),然后再执行async例子:可以切换promise看看
注意,第一个
await是一定会跳出async的,但后面的await如果没有返回promise,就会被内部转成promise,并立即resolve(retrunValue),因而不会跳出async。(这段可能不太准确)