在 JavaScript 中,实现异步编程主要有以下几种方式:
- 回调函数:将异步任务的完成回调函数作为参数传递给异步函数。
js
doSomething((result) => {
// 任务完成回调
});
- Promise:是一个代表异步操作的最终完成或失败的对象。它有三种状态:pending、fulfilled 和 rejected。
js
let promise = new Promise((resolve, reject) => {
// 异步任务
if (/*成功*/) {
resolve('Success');
} else {
reject(new Error('Failed'));
}
});
promise.then(value => { /*成功的回调*/ })
.catch(err => { /*失败的回调*/ });
- Async/Await:async 定义异步函数,await 只能在异步函数里面使用,等到一个异步操作完成后才会继续执行函数体内的代码。
js
async function doSomething() {
const result = await otherFunction();
// ...
}
- Generator:是一个返回迭代器的函数,可以在其内部使用 yield 语句进行暂停和恢复。
js
function* doSomething() {
yield 'a';
yield 'b';
yield 'c';
}
const iterator = doSomething();
iterator.next(); // { value: 'a', done: false }
iterator.next(); // { value: 'b', done: false }
iterator.next(); // { value: 'c', done: false }
iterator.next(); // { value: undefined, done: true }
- setTimeout/setInterval:setTimeout 用于在指定时间后调用函数一次,setInterval 用于指定时间间隔循环调用函数。
setTimeout(() => { /*回调函数*/ }, 1000);
let timer = setInterval(() => { /*回调函数*/ }, 1000);
clearInterval(timer); // 停止执行
所以,总结来说 JavaScript 中实现异步编程的主要方式有:
- 回调函数:最基本的方式,会产生回调地狱问题
- Promise:更高层的抽象,支持链式调用
- Async/Await:基于 Promise 实现,更加清晰简洁的语法
- Generator:可以暂停和恢复函数的执行
- setTimeout/setInterval:基于事件循环的 timers
我们应优先选择 Promise、Async/Await,这可以让我们的代码更加简洁易理解。并适当使用 setTimeout/setInterval 实现定时任务。