async/await 中的 try/catch

async/await 中的try/catch

es6中的async是异步编程的终极解决方案,近期学习了一下,相对于 generator 来说,具有更好的特性:内置执行器、更好的语义、更好的适用性,需要注意一点的是 await 后面是promise 对象或者原始类型的值。
更有意思的是可以使用 try/catch 来捕获异步中出现的异常

async/await中的 try/catch

// 定时器
function timer(params) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            // resolve('resolve');
            reject('reject');
        }, params);
    })
}

// async/await
async function fn(params) {
    try {
        var value = await timer(params);
    } catch (error) {
        console.log(error);        
    }
}

fn(1000); //执行

promise的状态变为 rejected 之后会跳转到 catch

内部实现

看了阮一峰老师的博客后,恍然大悟,原来是用 Generator.prototype.throw 和
Generator.prototype.next 来实现自动执行及异常抛出。

// 定时器
function timer(params) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            // resolve('resolve');
            reject('reject'); // next.value 为 rejected 状态
        }, params);
    })
}

// aysnc 声明的函数
function fn(args) {
    return spawn(function* () { // 配合 next 按步骤自动执行
        try {
            yield timer(args); // timer Promise类型
        } catch (error) {
            console.log(error);
        }
    });
}

// 自动执行器
function spawn(genF) {
    return new Promise(function (resolve, reject) {
        var gen = genF();

        function step(nextF) {
            try {
                var next = nextF(); // 执行 gen.next 或者 gen.throw ,使用 try/catch 捕获异常
            } catch (e) {
                return reject(e);
            }
            if (next.done) {
                return resolve(next.value);
            }
            Promise.resolve(next.value).then(function (v) {
                step(function () {
                    return gen.next(v);
                });
            }, function (e) {
                step(function () {
                    return gen.throw(e); // 若 next.value 是 rejected 状态,抛出异常,函数体内的try/catch捕获
                });
            });
        }
        step(function () {
            return gen.next(undefined);
        });
    });
}


fn(100).then(function (data) {
    console.log(data)
}).catch(function (error) {
    console.log(error);
})

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值