异步Async
-
async 的基本语法
1 let al=async () => { 2 let result=await n; 3 console.log(result); 4 }; 5 al ();
-
形式
A函数也是函数,所以具有普通函数该有的性质。不过形式上有两点不同:一是定义A函数时,function
关键字前需要有async
关键字(意为异步),表示这是个A函数。二是在A函数内部可以使用await
关键字(意为等待),表示会将其后面跟随的结果当成异步操作并等待其完成。
1 // 声明式 2 async function A() {} 3 4 // 表达式 5 let A = async function () {}; 6 7 // 作为对象属性 8 let o = { 9 A: async function () {} 10 }; 11 12 // 作为对象属性的简写式 13 let o = { 14 async A() {} 15 }; 16 17 // 箭头函数 18 let o = { 19 A: async () => {} 20 };
-
返回值
执行A函数,会固定的返回一个
Promise
对象。得到该对象后便可监设置成功或失败时的回调函数进行监听。如果函数执行顺利并结束,返回的P对象的状态会从等待转变成成功,并输出
return
命令的返回结果(没有则为undefined
)。如果函数执行途中失败,JS会认为A函数已经完成执行,返回的P对象的状态会从等待转变成失败,并输出错误信息。
1 // 成功执行案例 2 3 A1().then(res => { 4 console.log('执行成功', res); // 10 5 }); 6 7 async function A1() { 8 let n = 1 * 10; 9 return n; 10 } 11 12 // 失败执行案例 13 14 A2().catch(err => { 15 console.log('执行失败', err); // i is not defined. 16 }); 17 18 async function A2() { 19 let n = 1 * i; 20 return n; 21 }
-
await
只有在A函数内部才可以使用
await
命令,存在于A函数内部的普通函数也不行。引擎会统一将
await
后面的跟随值视为一个Promise
,对于不是Promise
对象的值会调用Promise.resolve()
进行转化。即便此值为一个Error
实例,经过转化后,引擎依然视其为一个成功的Promise
,其数据为Error
的实例。当函数执行到
await
命令时,会暂停执行并等待其后的Promise
结束。如果该P对象最终成功,则会返回成功的返回值,相当将await xxx
替换成返回值
。如果该P对象最终失败,且错误没有被捕获,引擎会直接停止执行A函数并将其返回对象的状态更改为失败,输出错误信息。最后,A函数中的
return x
表达式,相当于return await x
的简写。
1 // 成功执行案例 2 3 A1().then(res => { 4 console.log('执行成功', res); // 约两秒后输出100。 5 }); 6 7 async function A1() { 8 let n1 = await 10; 9 let n2 = await new Promise(resolve => { 10 setTimeout(() => { 11 resolve(10); 12 }, 2000); 13 }); 14 return n1 * n2; 15 } 16 17 // 失败执行案例 18 19 A2().catch(err => { 20 console.log('执行失败', err); // 约两秒后输出10。 21 }); 22 23 async function A2() { 24 let n1 = await 10; 25 let n2 = await new Promise((resolve, reject) => { 26 setTimeout(() => { 27 reject(10); 28 }, 2000); 29 }); 30 return n1 * n2; 31 }