同步 (Synchronous)
同步指的是程序中的操作按顺序执行,每个操作必须等待前一个操作完成后才能开始。简单来说,同步操作会阻塞后续操作,直到当前操作完成。同步编程模式适合于需要按顺序执行的任务。
示例:
假设有三个任务 A、B 和 C,它们依次执行。任务 B 必须等待任务 A 完成后才能开始,任务 C 也必须等待任务 B 完成后才能开始。
// 伪代码示例
function taskA() {
console.log('Task A completed');
}
function taskB() {
console.log('Task B completed');
}
function taskC() {
console.log('Task C completed');
}
taskA();
taskB();
taskC();
// 输出顺序:
// Task A completed
// Task B completed
// Task C completed
在上述例子中,taskB 只有在 taskA 完成后才会执行,taskC 只有在 taskB 完成后才会执行。
异步 (Asynchronous)
异步指的是程序中的操作不必等待前一个操作完成后再开始。异步操作会在后台执行,不会阻塞后续操作。异步编程模式适合于需要并发处理的任务,例如网络请求、文件读取等。
示例:
假设有三个任务 A、B 和 C,它们是异步执行的,任务 B 和任务 C 可以在任务 A 完成之前启动并执行。
// 伪代码示例
function taskA() {
setTimeout(() => {
console.log('Task A completed');
}, 1000); // 模拟异步操作,1秒后完成
}
function taskB() {
setTimeout(() => {
console.log('Task B completed');
}, 500); // 模拟异步操作,0.5秒后完成
}
function taskC() {
console.log('Task C completed');
}
taskA();
taskB();
taskC();
// 输出顺序可能是:
// Task C completed
// Task B completed
// Task A completed
在上述例子中,taskA 和 taskB 都是异步操作,它们不会阻塞 taskC。因此,taskC 会立即执行并输出结果,而 taskA 和 taskB 会在各自的定时器完成后输出结果。
同步和异步在实际编程中的应用
同步操作:常见于需要严格按照顺序执行的任务,例如处理用户输入、简单的数学计算等。
异步操作:常见于耗时操作,如网络请求、文件读取、定时任务等。通过异步操作,可以提高程序的并发性能和响应速度,不会因为某个耗时任务而阻塞整个程序。
异步编程在 JavaScript 中的实现:
回调函数:通过将回调函数作为参数传递给异步操作,在异步操作完成后调用回调函数。
function asyncTask(callback) {
setTimeout(() => {
console.log('Async task completed');
callback();
}, 1000);
}
asyncTask(() => {
console.log('Callback executed');
});
Promise:提供了一种更清晰的方式来处理异步操作,可以通过 .then 和 .catch 方法链式调用。
function asyncTask() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Async task completed');
resolve();
}, 1000);
});
}
asyncTask().then(() => {
console.log('Promise resolved');
});
async/await:是基于 Promise 的语法糖,使得异步代码看起来像同步代码。
async function runAsyncTask() {
await asyncTask();
console.log('Async/await completed');
}
runAsyncTask();