async总结

ES2017 标准引入了 async 函数,使得异步操作变得更加方便。

async 函数是什么?一句话,它就是 Generator 函数的语法糖。
—阮一峰

但是我更认为,async函数是Generator函数和Promise函数的语法糖。

async有一个await属性,相当于Promises的then方法。

async必须写在函数的前面,await方法必须在async方法的里面,且async的返回值是一个promises对象。(await后面跟一个await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。)

既然是promises对象则有三种状态 resolver,pendding,reject.

如果promises对象返回只没有调用resolver or reject 这两种方法的其中一种,没有报错的话则返回resolve,报错的话则返回reject状态的promises对象

我们来看一下这段代码

async function f() {
return await 123;
}

f().then(v => console.log(v))
// 123

刚才说了 async函数返回的对象类型为promise对象,在返回时具有resolve状态,f函数成功返回了123。

如果 async函数的异步操作失败了,则整个promise对象处于reject状态.async将被终止执行
看这段代码

async function f() {
await Promise.reject(‘出错了’);
await Promise.resolve(‘hello world’); // 不会执行
}

但是有时,我们想让它故意失败,但不终止异步操作,则可以这样写
async function f() {
try {
await Promise.reject(‘出错了’);
} catch(e) {
}
return await Promise.resolve(‘hello world’);
}

f()
.then(v => console.log(v))
// hello world

通过try/catch的写法,用异步的操作将Promise状态重新变成resolve.

还有一种直接通过catch方法处理错误

async function f() {
await Promise.reject(‘出错了’)
.catch(e => console.log(e));
return await Promise.resolve(‘hello world’);
}

f()
.then(v => console.log(v))
// 出错了
// hello world

如果错误没有被及时不捕获处理,那么结果还是reject

async function f() {
await new Promise(function (resolve, reject) {
throw new Error(‘出错了’);
});
}

f()
.then(v => console.log(v))
.catch(e => console.log(e))
// Error:出错了

最后,有一个问题向请教各位

async function* gen1() {
yield ‘a’;
yield ‘b’;
return 2;
}

async function* gen2() {
// result 最终会等于 2
const result = yield* gen1();
}

为什么这段代码我执行的话就是一个
index.html?__hbt=1516801344593:460 Uncaught SyntaxError: Unexpected token *

这个错误是什么原因,我一直搞不懂.(浏览器是360极速浏览器,内核是chorme的应该没有什么问题,由于电脑是XP系统,装不了chorme浏览器,所以…..)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值