async await 的底层原理

文章探讨了async/await在JavaScript中的工作原理,通过示例展示了如何使用它们来处理异步操作,如顺序读取文件。async函数实际上是基于Promise和生成器(generator)的概念,co库在这里起到了关键作用,协调生成器的执行。通过myco函数的实现,解释了如何将生成器函数转化为Promise链,从而实现异步流程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

async await 的底层原理

示例

async function run() {
  //await 等待的意恩,待局ose对象resolve时候的数据
  let a = await read("./data/a.txt");
  let b = await read("./data/b.txt");
  let c = await read("./data/c,txt");
  console.log(a, b, c);
}
run();


// 同下

function main() {
  return co(function* () {
    let a = yield read("./data/a.txt");
    let b = yield read("./data/b.txt");
    let c = yield read("./data/c.txt");
    return { a, b, c };
  });
}

main().then(data => {
    console.log(data.a+ data.b+ data.c)
})

genetator + promise +co库 (生成器 执行)

const fs = require('fs')

// 使用 Promsie 完成 a.txt b.txt c.txt 顺序的读取
function read(path) {
    return new Promise((resolve, reject) => {
        fs.readFile(path, 'utf-8', (error, data) => {
            if (error) {
                reject(error); // 失败
            } else {
                resolve(data)
            }
        })
    })
}



// generator    yield ,next  
function* run() {
    // yield 后面是一个Promise对象
    let a = yield read('./data/a.txt');
    let b = yield read('./data/b.txt');
    let c = yield read(' ./data/c.txt');// console.Log(c,c的值');return a + b + c;
   return a+b+c
}


// co的底层
/*自己实现一个 co库
1.参数是一个生成器函数
2.返回值是一个Promise对象
*/
function myco(generatorFn) {
    const it = generatorFn(); // 进行迷归调用
    return new Promise((resolve, reject) => {
        function next(lastValue) {
            let { value, done } = it.next(lastValue);
            if (done) {
                resolve(value); // 代表是完成了直接 resolve(value)
            } else {
                value.then(next, reject); // /生成器还没有执行完毕,
            }
        }
        next();
    })
}


myco(run).then(data => {
    console.log(data);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值