js 如何实现异步
异步实现方法
JavaScript 中实现异步编程有多种方式,以下是常见的几种方法:
回调函数(Callback)
回调函数是异步编程最基础的方式,通过将函数作为参数传递给另一个函数,在异步操作完成后调用该函数。
function fetchData(callback) {
setTimeout(() => {
callback('Data received');
}, 1000);
}
fetchData((data) => {
console.log(data); // 输出: Data received
});
Promise
Promise 是 ES6 引入的异步解决方案,比回调函数更易于管理和维护。
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data received');
}, 1000);
});
}
fetchData()
.then(data => console.log(data)) // 输出: Data received
.catch(error => console.error(error));
async/await
async/await 是 ES8 引入的语法糖,基于 Promise,使异步代码看起来像同步代码。
async function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data received');
}, 1000);
});
}
async function main() {
try {
const data = await fetchData();
console.log(data); // 输出: Data received
} catch (error) {
console.error(error);
}
}
main();
事件监听(Event Emitter)
通过事件监听机制实现异步,常用于 Node.js 环境。
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('data', (data) => {
console.log(data); // 输出: Data received
});
setTimeout(() => {
emitter.emit('data', 'Data received');
}, 1000);
Generator 函数
Generator 函数是 ES6 引入的另一种异步解决方案,通过 yield 暂停函数执行。
function* fetchData() {
yield new Promise((resolve) => {
setTimeout(() => {
resolve('Data received');
}, 1000);
});
}
const generator = fetchData();
generator.next().value.then(data => console.log(data)); // 输出: Data received
选择建议
- 简单异步任务:回调函数或 Promise。
- 复杂异步逻辑:async/await 更清晰易读。
- 事件驱动场景:事件监听更适合。
- 特殊需求:Generator 函数可用于更灵活的流程控制。
以上方法可根据具体场景和需求选择使用。







