async await
本身就是promise + generator
的语法糖。
会讲述以下内容 1. async awiat 实质 || 降级策略 2. async await 主要特性
// 转换目标 async1
// async function async1() {
// console.log('async1 start');
// await async2();
// console.log('async1 end');
// }
function async1() {
// 将 async 转换成 *,将 awiat 转换成 yield
var awaitInstance = (function* () {
console.log('async1 start');
yield async2();
console.log('async1 end');
})()
// 自动执行 await 及后续代码
// 简单起见,不处理异常情况
function step() {
var next = awaitInstance.next();
// 使用Promise获取 异步/同步 方法的结果,再执行下一步
Promise.resolve(next.value).then(function (val) {
if (!next.done) step();
})
}
step();
// 返回Promise
return Promise.resolve(undefined);
}
function async1(args) {
return myAsyncAwait(function* () {
console.log('async1 start');
yield async2();
console.log('async1 end');
});
}
function myAsyncAwait(genFn) {
return new Promise(function(resolve, reject) {
const gen = genFn();
function step(nextFn) {
let next;
try {
next = nextFn();
} 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); });
});
}
step(function() { return gen.next(undefined); });
});
}