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); 能窥见函数间接回到数组时,回到的是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());能窥见回到的也是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); 能窥见,采用了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()); 上图能窥见遇到第两个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());他们先梳理一下函数的执行过程,
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函数进行异常处理。