1.回调函数(Callback)
函数作为参数传递给另一个函数,在执行完毕后调用该外部函数以处理结果。
```javascript
function asyncFunction(callback) {
// 异步操作
setTimeout(() => {
let result = 'Some asynchronous operation completed';
callback(result);
}, 2000); // 模拟异步延迟
}
asyncFunction((result) => {
console.log('Callback received: ', result);
});
```
2.Promise
Promise 是现代JavaScript处理异步操作的一种非常强大的工具。它封装了异步操作的状态,并允你以同步的方式编写代码。
```javascript
function fetchData(url, callback) {
fetch(url)
.then((response) => response.text())
.then((data) => {
console.log('Data received:', data);
callback(null, data);
})
.catch((error) => {
console.error('Error fetching data:', error);
callback(error);
});
}
fetchData('https://example.com/data', (err, data) => {
if (err) return console.error(err);
// 处理数据
// ...
});
```
3.async/await
是Promise和async函数的组合,使得异步代码看起来更像同步代码。
```javascript
async function fetchData(url) {
try {
const response = await fetch(url);
const data = await response.text();
console.log('Data received:', data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
fetchData('https://example.com/data');
```
4.Node.js 中的异步I/O
Node.js 提供了非阻塞IO操作,使得在服务器端开发时可以处理大量并发请求。
```javascript
const fs = require('fs');
fs.readFile('/path/to/file', 'utf8', (err, data) => {
if (err) throw err;
console.log('File contents:', data);
});
```
5.Generator 函数
使用生成器函数可以创建异步操作的控制流程,但通常在处理异步数据时不如Promise或async/await流行。
```javascript
function* asyncGenerator() {
let value = yield new Promise((resolve) => setTimeout(resolve, 1000));
console.log('Value:', value);
}
const gen = asyncGenerator();
gen.next().then(() => gen.next(42));
```
在选择异步编程方式时,考虑你的项目需求和团队的熟悉程度。Promise 和 async/await 通常提供更现代、易于理解的方法来处理异步操作