模拟实现async await
时间: 2023-10-10 21:13:57 浏览: 192
async和await使用简单实例
模拟实现async await可以通过使用Promise和generator函数来实现。首先,我们可以将要执行的异步操作封装成一个Promise对象。然后,使用generator函数来控制Promise对象的执行。在generator函数内,可以通过调用yield来暂停异步操作的执行,而不阻塞后续代码的执行。当异步操作完成时,通过调用generator函数的next方法来继续执行后续代码。最后,通过递归调用generator函数来实现异步操作的链式调用。
以下是一个简单的模拟实现async await的例子:
```
function myAsync(fn) {
return function () {
const gen = fn.apply(this, arguments);
return new Promise((resolve, reject) => {
function step(key, arg) {
let generatorResult;
try {
generatorResult = gen[key](arg);
} catch (error) {
return reject(error);
}
const { value, done } = generatorResult;
if (done) {
return resolve(value);
} else {
return Promise.resolve(value).then(
(val) => step("next", val),
(err) => step("throw", err)
);
}
}
step("next");
});
};
}
// 使用示例
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const asyncFunc = myAsync(function* () {
yield delay(1000);
console.log(1);
yield delay(1000);
console.log(2);
yield delay(1000);
console.log(3);
});
asyncFunc().then(() => {
console.log("执行完成");
});
```
阅读全文