参考

终于来到我们熟悉的async函数🌶,这是目前异步编程的终极解决方案

1.async函数定义

一句话:async函数就是Generator函数的语法糖。
Generator函数实现文件读取

  1. var fs = require('fs');
  2. // promise化
  3. var readFile = function (fileName){
  4. return new Promise(function (resolve, reject){
  5. fs.readFile(fileName, function(error, data){
  6. if (error) reject(error);
  7. resolve(data);
  8. });
  9. });
  10. };
  11. var gen = function* (){
  12. var f1 = yield readFile('/etc/fstab');
  13. var f2 = yield readFile('/etc/shells');
  14. console.log(f1.toString());
  15. console.log(f2.toString());
  16. };
  17. // 手动执行
  18. var g = gen()
  19. g.next().value.then(data => {
  20. g.next(data).value.then(data => {
  21. ...
  22. })
  23. })

反观async函数,就很简单

  1. var asyncReadFile = async function (){
  2. var f1 = await readFile('/etc/fstab');
  3. var f2 = await readFile('/etc/shells');
  4. console.log(f1.toString());
  5. console.log(f2.toString());
  6. };
  7. // 直接调用执行
  8. asyncReadFile();

2.async函数优点

  • 内置执行器,不需要额外使用co这样的执行器
  • 语义化,async和await 相较于 *和yield 更加语义化
  • 更广的适用性,async函数支持原始数据类型。yield后面只能是Thunk函数或者Promise对象