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浏览器,所以…..)