在 ECMAScript(JavaScript)中,处理异步操作的发展经历了几个阶段,从早期的回调函数,到 Promise,再到 async/await。下面系统地介绍常见方式及适用场景。
最原始的异步处理方式。
function fetchData(callback) {
setTimeout(() => {
callback('数据来了');
}, 1000);
}
fetchData((data) => {
console.log(data);
});
问题:
Promise 是异步操作的标准化方案。
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('数据来了');
}, 1000);
});
}
fetchData()
.then(data => console.log(data))
.catch(err => console.error(err));
Promise.thenPromise.catchPromise.finallyPromise.all([p1, p2])Promise.race([p1, p2])Promise.allSettled(ES2020)基于 Promise 的语法糖,使异步代码“看起来像同步”。
async function getData() {
try {
const data = await fetchData();
console.log(data);
} catch (err) {
console.error(err);
}
}
getData();
优点:
try/catchconst [a, b] = await Promise.all([task1(), task2()]);
for (const url of urls) {
await request(url);
}
在 Node.js 中常见:
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('done', (msg) => {
console.log(msg);
});
emitter.emit('done', '完成');
setTimeout
setInterval
requestAnimationFrame(浏览器)
for await (const item of asyncGenerator()) {
console.log(item);
}
✅ 优先使用 async/await
✅ 用 Promise.all 做并发
✅ 避免混用 callback 和 Promise
✅ 始终处理异常(.catch 或 try/catch)
如果你有具体场景(如:前端请求、Node.js IO、并发限制、取消请求),我可以给更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。