手撕Promise 和async await的原理

// // 当调用一个 async 函数时,会返回一个 Promise 对象 (关键)
// // async/await 出现的异常是无法捕获的,需要借助 try/catch 来捕获异常
// function sleep(flag) {
//     return new Promise((resolve, reject) => {
//         setTimeout(() => {
//             if(flag){
//                 resolve('success')
//             }else{
//                 reject('Error')
//             }
//         }, 2000)
//     })
// }

// // async await 的用法
// async function fn(flag) {
//     try {
//         let result = await sleep(flag)
//         console.log(result);
//         return result
//     } catch (err) {
//         return err
//     }
// }
// // 返回的 a,b 是一个 promise 对象
// var a = fn(true)
// var b = fn(false)
// console.log(a)
// console.log(b)
// a.then((res)=>{
//     // console.log(res) // success
// })
// b.then((res)=>{
//     // console.log(res) // Error
// })
function* gen() {
    console.log('start');
    const num1: number = yield 3;
    console.log(num1);
    const num2: number = yield 2;
    console.log(num2);
    return 3;
}
const g = gen();


function asyncGenerator(generatorFn) {
    return function() {
        const fn = generatorFn.apply(this, arguments);
        return new Promise((resolve, reject) => {
            function go(key, args?) {
                let res;
                try {
                    res = fn[key](args);
                } catch (error) {
                    return reject(error);
                }
                let {value, done} = res;
                if(done) {
                    return resolve(value)
                } else {
                    Promise.resolve(value).then(data => go('next', value)).catch(err => go('throw', err));
                }
            }
            go('next');
        })
    }
}

const asyncFn = asyncGenerator(gen)
asyncFn().then(res => console.log(res))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东哥爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值