async函数的实现原理+实例

知识基础,了解generator的用法

// generator是实现async函数的关键
function* helloWorldGenerator() {
  yield '1';
  yield '2';
  return 'ending';
}

var hw = helloWorldGenerator();
hw.next()
// { value: '1', done: false }

hw.next()
// { value: '2', done: false }

hw.next()
// { value: 'ending', done: true }

hw.next()
// { value: undefined, done: true }
复制代码

案例

let fs = require('fs');
function readFile(filename) {
    return new Promise(function (resolve, reject) {
        fs.readFile(filename, function (err, data) {
            if (err)
                reject(err);
            else
                resolve(data);
        })
    })
}
function* read() {
    let template = yield readFile('./template.txt');
    let data = yield readFile('./data.txt');
    return template + '+' + data;
}
co(read).then(function (data) {
    console.log(data);
}, function (err) {
    console.log(err);
});
复制代码

解析

这里需要注意的是co函数的实现(如下),co函数是用来模拟async的关键

function co(gen) {
  // 初始化迭代器
  let it = gen();
  return new Promise(function (resolve, reject) {
     // 递归调用next,确保yeild后面的内容依次全部执行
    !function next(lastVal) {
      let {value, done} = it.next(lastVal);
      if (done) {
        resolve(value);
      } else {
        // 每次yield 的值,会作为next函数的参数
        // 所以上面的例子 let template = yield readFile('./template.txt') ,template就是yeild表达式返回的值
        value.then(next, reason => reject(reason));
      }
    }();
  });
}
复制代码

补充

// async 函数的实现,就是将 Generator 函数和自动执行器,包装在一个函数里。
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;
  });
}
复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值