async函数实现原理

async函数原理是generator和promise,其中最重要的一个核心方法是co函数

  1. co函数 原版是tj所写,见https://github.com/tj
  2. 下面的co函数是自己的简单实现

co函数

function co(gen) {
  let it = gen(); 
  return new Promise(function(resolve, reject) {
    !function next(lastVal) {
      let {value, done} = it.next(lastVal);
      if(done) {
        resolve(value)
      }else {
        value.then(next, reject);
      }
    }
  })
}

async函数等价于

async function read() {
  let template = await readFile('./template.txt');
  let data = await readFile('./data.txt');
  return template + data;
}

// 上面的函数等价于
function read() {
  return co(function *() {
    let template = yield readFile('./template.txt');
    let data = yield readFile('./data.txt');
    return template + data;
  })
}

文章中用到的其他函数

let fs = require('fs');
function readFile(fileName) {
  return new Promise(function(resolve, reject) {
    fs.readFile(fileName, 'utf8', function(err, data) {
      err ? reject(err) : resolve(data)
    })
  })
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基本概念 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async 函数是什么?一句话,...
    wdapp阅读 210评论 0 0
  • 写在前面的话 在前端面试中,经常会问到ES6属性的问题而Async是常考题,里面还有一些演变今天先分享实现原理~ ...
    赵国星阅读 294评论 0 0
  • 关于 Thunk 这个词,其实第一次看到是 redux-thunk[https://github.com/redu...
    越前君阅读 488评论 0 1
  • 今天我们要说的主⼈公是ES7中新引⼊的语法 “async + await”,被称为异步的完美解决⽅案。当然了不是一...
    江平路阅读 2,842评论 0 0
  • 前言 在公司的项目中,我们经常用到async await 这样的函数,它的作用也很奇特,可以让异步的函数等待异步执...
    hahajj_2e72阅读 471评论 0 0