首先,await 只能出现在 async 函数中。
async 函数负责返回一个 Promise 对象如果在async函数中 return 一个直接量,
async 会把这个直接量通过Promise.resolve() 封装成 Promise 对象;
如果 async 函数没有返回值,它会返回 Promise.resolve(undefined)
一般我们都用await去等带一个async函数完成,不过按语法说明,
await 等待的是一个表达式,这个表达式的计算结果是 Promise
对象或者其它值。所以,await后面实际可以接收普通函数调用或者直接量。
- 1
- 2
- 3
如果await等到的不是一个promise对象,那跟着的表达式的运算结果就是它等到的东西;
如果是一个promise对象,await会阻塞后面的代码,等promise对象resolve,
得到resolve的值作为await表达式的运算结果虽然await阻塞了。
resolve的值,就相当于then中的val。
但await在async中,async不会阻塞,它内部所有的阻塞都被封装在一个promise对象中异步执行。当遇到await时,他会先让出当前线程,将后面的代码加到任务队列中,然后继续执行函数后面的同步代码。
3、async 函数对 Generator 函数的改进,体现在以下三点。
(1)内置执行器。 Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行。
var result =async ReadFile();
(2)更好的语义。 async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。
(3)更广的适用性。 co 函数库约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。
对于async/await的模式,如果在try…catch语句中不使用await关键字,那么try…catch子句不会真正工作。