如何在Javascript中实现异步编程?有哪些方式?

在 JavaScript 中,实现异步编程主要有以下几种方式:

  1. 回调函数:将异步任务的完成回调函数作为参数传递给异步函数。
js
doSomething((result) => {
  // 任务完成回调
});
  1. Promise:是一个代表异步操作的最终完成或失败的对象。它有三种状态:pending、fulfilled 和 rejected。
js
let promise = new Promise((resolve, reject) => {
  // 异步任务
  if (/*成功*/) {
    resolve('Success');
  } else { 
    reject(new Error('Failed'));
  }
});

promise.then(value => { /*成功的回调*/ })
  .catch(err => { /*失败的回调*/ }); 
  1. Async/Await:async 定义异步函数,await 只能在异步函数里面使用,等到一个异步操作完成后才会继续执行函数体内的代码。
js
async function doSomething() { 
  const result = await otherFunction(); 
  // ...
}
  1. 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 }
  1. setTimeout/setInterval:setTimeout 用于在指定时间后调用函数一次,setInterval 用于指定时间间隔循环调用函数。
setTimeout(() => { /*回调函数*/ }, 1000);

let timer = setInterval(() => { /*回调函数*/ }, 1000);
clearInterval(timer); // 停止执行

所以,总结来说 JavaScript 中实现异步编程的主要方式有:

  1. 回调函数:最基本的方式,会产生回调地狱问题
  2. Promise:更高层的抽象,支持链式调用
  3. Async/Await:基于 Promise 实现,更加清晰简洁的语法
  4. Generator:可以暂停和恢复函数的执行
  5. setTimeout/setInterval:基于事件循环的 timers

我们应优先选择 Promise、Async/Await,这可以让我们的代码更加简洁易理解。并适当使用 setTimeout/setInterval 实现定时任务。