JavaScript中的async/await详解

2022-12-19 0 1,054

1、序言

async函数,也是他们常说的async/await,是在ES2017(ES8)导入的新优点,主要就目地是为的是精简采用如前所述Promise的API时所需的句法。async和awaitURL让他们能用一类更简约的形式写下如前所述Promise的触发器犯罪行为,而无须故意地拉艾初始化Promise。

2、简述

​ async则表示函数里有触发器操作形式,await则表示紧随在前面的函数须要等候结论。须要特别注意的是awaitURL只在async函数内有效率,假如在async函数体以外采用它,会放出错别字。

2.1、async

​ async函数回到两个 Promise第一类,能采用then形式加进反弹函数。如果采用async,无论函数外部回到的呢Promise第一类,单厢被包装袋成Promise第一类。

话不多说,上标识符看效用:

2.1.1、函数回到非Promise第一类

async function testAsync() { return “hello async”; } const result = testAsync(); console.log(result);
JavaScript中的async/await详解

​ 能窥见函数间接回到数组时,回到的是Promise第一类,相等于间接透过Promise.resolve()将数组PCB为Promise第一类。假如函数没回到值时,PromiseResult结论为undefined。

2.1.2、函数回到Promise第一类

async function testAsync() { return new Promise(function(resolve, reject) { if (true) { resolve(resolve return) } else { reject(reject return) } }) } console.log(testAsync());
JavaScript中的async/await详解

能窥见回到的也是Promise第一类。

2.2、await

​ awaitURL能跟在任意变量或者函数之前,但通常await前面会跟两个触发器过程。await采用时,会阻塞后续标识符执行。他们先抛开async,单独谈await。

​ 由于await只能在async标识的函数内采用,以下例子请在浏览器控制台执行看效用。

function testAsync() { return new Promise(function(resolve, reject) { setTimeout(function() { if (true) { console.log(请求中…) resolve(resolve return) } else{ reject(reject return) } }, 2000) }) } var result = await testAsync(); var result1 = await “testAsync后执行”; console.log(result); console.log(result1);
JavaScript中的async/await详解

​ 能窥见,采用了await后,必须得等testAsync形式执行完后,才会执行后续标识符。您也能尝试一下把testAsync前的async去掉,看看跟加上await时有啥区别。

2.3、async、await结合采用

​ 上面他们知道了await会阻塞后续标识符运行,那怎么解决这个问题呢?就须要用到async,采用async后,函数执行时,一旦遇到await就会先回到两个Promise第一类,等到await后的操作形式完成后,再接着执行async函数体内的语句。

​ 先上句法:

async function 函数名() { await XXX; }

​ 上示例标识符:

function testAsync() { return new Promise(function(resolve, reject) { setTimeout(function() { if (true) { console.log(请求中…) resolve(resolve return) } else{ reject(reject return) } }, 2000) }) } function testAsync2() { return new Promise(function(resolve, reject) { setTimeout(function() { if (true) { console.log(请求中2…) resolve(resolve return2) }else { reject(reject return2) } }, 2000) }) } async function test() { console.log(test开始…); var value1 = await testAsync(); console.log(value1); var value2 = await testAsync2(); console.log(value2);var value3 = await test结束…; console.log(value3); } console.log(test());
JavaScript中的async/await详解

​ 上图能窥见遇到第两个await后,立即回到了Promise第一类,然后再按顺序去执行testAsync函数,等候testAsync函数执行后再去执行testAsync2函数。还能窥见async函数能精简Promise的句法,以往我们须要采用.then去处理反弹,现在他们能采用await像写同步标识符一样去写触发器标识符。

​ 他们再升级一下,在上面的基础上再加入两个普通函数:

function fun1() { return 函数1 } function fun2() { return 函数2 } function fun3() { console.log(fun1()); console.log(test()); // async/await函数 console.log(fun2()); }console.log(fun3());
JavaScript中的async/await详解

他们先梳理一下函数的执行过程,

1、先执行函数1

2、进入test函数并输出开始

3、在test函数中遇到await,立即回到Promise第一类

4、执行函数2

5、执行test函数中的testAsync形式

6、等到test函数中的testAsync形式执行完后,继续执行testAsync2形式

7、test函数结束

​ 能窥见,async函数在遇到await后会立即回到Promise第一类,继续执行async函数外部后续逻辑,async函数外部会被await阻塞并按顺序执行标识符逻辑。

2.4、async、await异常处理

​ await前面的函数是有可能出现异常的,所以最好把await命令放在try…catch标识符块中。假如await后是Promise第一类,也能采用.catch进行捕获。

// 第一类写法 async function myFunction() { try { await something(); } catch (err) { console.log(err); } } // 第二种写法 async function myFunction() { await somethingPromise() .catch(function (err) { console.log(err); }); }

3、总结

​ async函数在遇到await后会立即回到Promise第一类,继续执行async函数外部逻辑,async函数外部会被await阻塞并按顺序执行标识符逻辑。

​ 能采用try…catch或.catch对async函数进行异常处理。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务