您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# JavaScript的异步操作方法是什么
## 目录
1. [引言](#引言)
2. [同步与异步编程基础](#同步与异步编程基础)
3. [回调函数(Callbacks)](#回调函数callbacks)
4. [Promise对象](#promise对象)
5. [Async/Await语法](#asyncawait语法)
6. [事件监听(Event Listeners)](#事件监听event-listeners)
7. [Generator函数](#generator函数)
8. [Web Workers](#web-workers)
9. [异步编程最佳实践](#异步编程最佳实践)
10. [常见问题与解决方案](#常见问题与解决方案)
11. [总结](#总结)
---
## 引言
JavaScript作为单线程语言,通过异步操作实现非阻塞式编程。本文将系统介绍7种主流异步方案及其应用场景。
---
## 同步与异步编程基础
### 同步编程特点
```javascript
console.log("步骤1");
console.log("步骤2"); // 必须等待步骤1完成
console.log("启动请求");
setTimeout(() => console.log("请求完成"), 1000);
console.log("继续执行"); // 不等待定时器
关键差异: - 同步:阻塞式执行 - 异步:非阻塞式执行 - 执行顺序:同步代码 > 微任务 > 宏任务
function fetchData(callback) {
setTimeout(() => {
callback('数据加载完成');
}, 1000);
}
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
getUser(id, user => {
getOrders(user, orders => {
getItems(orders, items => {
// 嵌套层级持续加深
});
});
});
解决方案: - 拆分为命名函数 - 使用Promise/Async
const promise = new Promise((resolve, reject) => {
if (success) {
resolve(value);
} else {
reject(error);
}
});
fetch('/api/data')
.then(response => response.json())
.then(data => processData(data))
.catch(error => handleError(error));
Promise.all([p1, p2]).then(values => {});
Promise.race([p1, p2]).then(first => {});
async function loadData() {
try {
const response = await fetch('/api');
const data = await response.json();
return data;
} catch (error) {
console.error(error);
}
}
async function parallel() {
const [res1, res2] = await Promise.all([
fetch(url1),
fetch(url2)
]);
}
button.addEventListener('click', () => {
console.log('按钮被点击');
});
const emitter = new EventEmitter();
emitter.on('data', data => handleData(data));
emitter.emit('data', payload);
function* gen() {
yield '第一步';
yield '第二步';
return '完成';
}
const g = gen();
g.next(); // { value: '第一步', done: false }
function* fetchUser() {
const user = yield fetch('/user');
const posts = yield fetch('/posts');
}
const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = e => console.log(e.data);
// worker.js
self.onmessage = function(e) {
const result = heavyCalculation(e.data);
self.postMessage(result);
};
解决方案:
process.on('unhandledRejection', error => {});
防护方案:
function once(callback) {
let called = false;
return (...args) => {
if (!called) {
called = true;
callback(...args);
}
};
}
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
回调函数 | 简单异步操作 | 兼容性最好 | 容易产生嵌套 |
Promise | 链式异步操作 | 可读性高 | 无法取消 |
Async/Await | 复杂异步流程 | 同步式编写 | 需要ES2017+支持 |
Web Workers | CPU密集型任务 | 不阻塞主线程 | 通信成本高 |
未来趋势:Top-Level Await、Observable等新特性正在普及。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。