文章目录
一、概念
async函数:处理异步编程 类似状态机; 封装多个promise进行异步编程
也就是 Generator 函数的语法糖。
const gen = function* () {
const f1 = yield readFile('/etc/fstab');
const f2 = yield readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
将 Generator 函数的星号(*)替换成async,将yield替换成await:
const asyncReadFile = async function () {
const f1 = await readFile('/etc/fstab');
const f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
};
特点:
- async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果
- async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)
- async函数的返回值是 Promise 对象
- async函数内部return语句返回的值,会成为then方法回调函数的参数
针对3、4:
async function f() {
return 'hello world';
}
f().then(v => console.log(v))
// "hello world"
async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到
async function f() {
throw new Error('出错了');
}
f().then(
v => console.log('resolve', v),
e => console.log('reject', e)
)
//reject Error: 出错了
二、对比 Promise联用Generator && Promise联用async
1.Promise联用Generator
let fun= function () {
return new Promise(function (resolve,reject) {
setTimeout(function () {
resolve("数据");
},2000)
})
}
let f= function* () {
yield fun();
}
let inter=f();
//console.log(inter.next()); //{value: Promise, done: false}
inter.next().value.then(function (res) {
console.log(res