携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天juejin.cn/post/712312…
掌握async与Generator函数的区别,以及怎么封装的异步?
async函数与Generator函数的改进,体现在以下四点:
(1)内置执行器,就不需要next方法了,在调用的时候,就不需要再自己.value.then了,就跟普通函数调用就可以了。
Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行。
2)更好的语义。
async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
(3)更广的适用性。
co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。
(4)返回值是 Promise。
async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。
co模块是封装好的执行器
- await的返回值是promise成功状态的异步结果,如果不是promise,返回的就是对应的值;yield没有返回值或者是undefined,想要有返回值,得自己手动封装执行器
- async函数的返回值是一个promise对象,调用async函数的时候就可以直接调用then方法,接着对最后的总结果进行处理
- return 返回的数据就是promise成功状态的数据,就是then方法里的value值。如果async函数里是抛出throw错误,那么就会执行async返回的promise对象的catch方法。
- 注意:return不是必须写的,不写的话async函数返回的promise是一个空的,没有value值。
await后面跟的就是promise对象,promise状态决定了async返回值的promise对象的状态。
练习promise和saync结果