使用 javascript 如何实现 async await
async/await 是 ES2017(ES8)引入的 JavaScript 语法糖,用于简化异步操作的书写。它使得异步代码看起来像同步代码,提高了代码的可读性。 之前遇到面试官问 如何使用 javascript 实现 async await?
,所以考虑了下如何实现。
使用 generator 实现
实现一个 async 函数,传入一个 generator,返回一个promise,递归调用 generator next。
js
function async(gen) {
const g = gen();
return new Promise((resolve, reject) => {
function setup(promi) {
promi
.then((value) => {
const v = g.next(value);
if (v.done) resolve(v.value);
else setup(Promise.resolve(v.value));
})
.catch(reject);
}
const v = g.next();
setup(Promise.resolve(v.value));
});
}
使用 async 函数
js
function call(num, wait = 1000) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(num);
}, wait);
});
}
function* gen() {
let num = yield call(1, 1000);
console.log(num);
num = yield call(2, 2000);
console.log(num);
num = yield call(3, 3000);
console.log(num);
return num;
}
async(gen).then(console.log);