在 Ubuntu 上进行 JavaScript 异步编程,其实有多种实现方式。常见的包括回调函数、Promise 和 async/await 这三种模式。下面逐一拆解,看看它们各自如何运作。

1. 回调函数
回调函数可以说是异步编程的经典模式。简单来说,就是将一段函数作为参数传入另一个函数,当异步操作完成后,再回头调用它。
function asyncOperation(callback) {
setTimeout(() => {
const result = 'Operation completed';
callback(result);
}, 1000);
}
asyncOperation((result) => {
console.log(result); // 输出: Operation completed
});
这种写法虽然直观,但如果嵌套层次过多,就容易陷入“回调地狱”——大量花括号层层堆叠,代码读起来如同翻山越岭,可维护性大幅下降。
2. Promises
ES6 带来了 Promise 机制,为回调问题提供了有效的解决方案。它通过链式调用替代嵌套,让代码瞬间变得清爽许多。
function asyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const result = 'Operation completed';
resolve(result);
}, 1000);
});
}
asyncOperation()
.then((result) => {
console.log(result); // 输出: Operation completed
})
.catch((error) => {
console.error(error);
});
这里的关键在于:Promise 对象代表一个未来的值,要么成功(resolve),要么失败(reject)。随后通过 .then 和 .catch 分别处理成功和失败场景,逻辑清晰,一目了然。
3. async/await
到了 ES2017,async/await 横空出世。它本质上是 Promise 的语法糖,但写起来如同同步代码,可读性直接拉满。
async function run() {
try {
const result = await asyncOperation();
console.log(result); // 输出: Operation completed
} catch (error) {
console.error(error);
}
}
run();
注意,async 函数内部可以使用 await 等待一个 Promise,而 try/catch 则负责捕获异常。对于习惯编写同步代码的开发者来说,这简直就是救星。
示例代码
光说不练假把式,下面提供一个完整的示例,在 Ubuntu 的 Node.js 环境中运行,看看三种方式一起上阵的效果。
安装Node.js
首先确保机器上装有 Node.js。如果尚未安装,在终端中输入以下命令即可:
sudo apt update
sudo apt install nodejs
sudo apt install npm
创建一个JavaScript文件
新建一个文件,例如 async_example.js,将下面的代码粘贴进去:
// 使用回调函数
function asyncOperationWithCallback(callback) {
setTimeout(() => {
const result = 'Operation completed with callback';
callback(result);
}, 1000);
}
asyncOperationWithCallback((result) => {
console.log(result); // 输出: Operation completed with callback
});
// 使用Promises
function asyncOperationWithPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const result = 'Operation completed with promise';
resolve(result);
}, 1000);
});
}
asyncOperationWithPromise()
.then((result) => {
console.log(result); // 输出: Operation completed with promise
})
.catch((error) => {
console.error(error);
});
// 使用async/await
async function run() {
try {
const result = await asyncOperationWithPromise();
console.log(result); // 输出: Operation completed with promise
} catch (error) {
console.error(error);
}
}
run();
运行脚本
在终端中执行:
node async_example.js
你会看到如下输出:
Operation completed with callback
Operation completed with promise
Operation completed with promise
可以看到,三种方式都实现了相同的效果——延迟一秒后输出结果。选择哪种方案,完全取决于项目风格和个人习惯。回调函数适用于简单场景,Promise 能优雅地处理链式依赖,而 async/await 则让代码更接近同步逻辑,读起来心情舒畅。在 Ubuntu 环境下,这些方法都能无缝运行,任意挑选一种即可上手实践。
