手写async和await
时间: 2023-08-27 16:20:14 浏览: 137
async和await的用法
手写async和await的实现可以通过使用generator函数和Promise来实现。首先,我们可以将async函数转换为一个generator函数。然后,我们可以编写一个自动执行的函数来处理generator函数中的yield语句,并使用Promise来处理异步操作。
以下是一个手写的async和await的示例代码:
```javascript
function asyncToGenerator(generatorFunc) {
return function () {
const iterator = generatorFunc.apply(this, arguments);
return new Promise((resolve, reject) => {
function step(key, arg) {
let generatorResult;
try {
generatorResult = iterator[key](arg);
} catch (error) {
reject(error);
return;
}
const { value, done } = generatorResult;
if (done) {
resolve(value);
} else {
return Promise.resolve(value).then(
(val) => step("next", val),
(err) => step("throw", err)
);
}
}
step("next");
});
};
}
const getData = () => new Promise((resolve) => setTimeout(() => resolve("data"), 1000));
const test = asyncToGenerator(function* testG() {
const data = yield getData();
console.log('data: ', data);
const data2 = yield getData();
console.log('data2: ', data2);
return 'success';
});
test().then(res => console.log(res));
```
在这个示例中,我们定义了一个名为`asyncToGenerator`的函数,它接受一个generator函数作为参数,并返回一个包装了Promise的自动执行函数。
在`test`函数中,我们使用`yield`关键字来暂停执行,并使用`getData`函数返回的Promise来处理异步操作。当Promise resolve后,generator函数会继续执行,并将结果传递给下一个yield语句。
最后,我们使用`.then`方法来处理test函数的返回值。
这样,我们就实现了一个手写的async和await的功能。注意,这只是一个简化的实现,真正的async和await功能更为复杂,包含更多的特性和错误处理机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [手写async await的最简实现(20行搞定)!阿里字节面试必考](https://blog.csdn.net/xgangzai/article/details/106536325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
- *2* [手写async await的以及深度挖掘(一挖到底)](https://blog.csdn.net/JIANYMN/article/details/123229551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文