异步Async

异步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 }

 

上一篇:Android源码分析之原型模式


下一篇:.NET Core学习笔记——async/await中的Exception处理