在 ECMAScript(JavaScript) 中,处理异步操作主要有以下几种方式,按发展顺序和推荐程度如下:
最原始的方式。
function fetchData(callback) {
setTimeout(() => {
callback("数据");
}, 1000);
}
fetchData((data) => {
console.log(data);
});
问题:容易形成“回调地狱”(Callback Hell)
a(() => {
b(() => {
c(() => {
// ...
});
});
});
用于解决回调地狱。
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("数据");
}, 1000);
});
}
fetchData()
.then(data => console.log(data))
.catch(err => console.error(err));
fetchData()
.then(a)
.then(b)
.then(c)
.catch(err => console.error(err));
基于 Promise,语法更像同步代码。
function fetchData() {
return new Promise(resolve => {
setTimeout(() => resolve("数据"), 1000);
});
}
async function main() {
try {
const data = await fetchData();
console.log(data);
} catch (err) {
console.error(err);
}
}
main();
✅ 优点
适用于事件驱动场景(如 DOM、Node.js)。
button.addEventListener("click", () => {
console.log("点击了");
});
async/await 出现前的过渡方案。
function* gen() {
const data = yield fetchData();
console.log(data);
}
现在基本不用了。
| 方式 | 推荐度 | 场景 |
|---|---|---|
| async / await | ⭐⭐⭐⭐⭐ | 绝大多数异步 |
| Promise | ⭐⭐⭐⭐ | 底层封装 |
| 回调 | ⭐ | 旧代码 / 简单场景 |
| 事件 | ⭐⭐⭐ | UI / 事件驱动 |
如果你愿意,我也可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。