返回

深入浅出:JavaScript 中的同步与异步操作

前端

JavaScript 中的同步和异步操作

JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。当 JavaScript 引擎遇到同步代码时,它会立即执行该代码,然后继续执行队列中的下一项任务。但是,当 JavaScript 引擎遇到异步代码时,它会将该代码排队,然后继续执行队列中的下一项任务。当异步操作完成后,JavaScript 引擎将返回并执行排队的异步代码。

同步操作

同步操作是立即执行且不会阻塞主线程的操作。例如,以下代码片段中的 console.log() 语句是同步操作:

console.log("Hello, world!");

当 JavaScript 引擎执行此代码片段时,它会立即将 "Hello, world!" 输出到控制台,然后继续执行队列中的下一项任务。

异步操作

异步操作是非立即执行且不会阻塞主线程的操作。例如,以下代码片段中的 setTimeout() 函数是一个异步操作:

setTimeout(() => {
  console.log("Hello, world!");
}, 1000);

当 JavaScript 引擎执行此代码片段时,它会将 setTimeout() 函数排队,然后继续执行队列中的下一项任务。在 1000 毫秒后,当 setTimeout() 函数被执行时,它会将 "Hello, world!" 输出到控制台。

JavaScript 中的事件循环

事件循环是 JavaScript 引擎管理同步和异步代码执行的一种机制。事件循环是一个无限循环,它不断检查是否有要执行的任务。如果有待执行的任务,事件循环会将该任务添加到队列中。当队列为空时,事件循环会阻塞。

以下是如何在 JavaScript 中运作的事件循环的简化表示:

while (true) {
  if (队列不为空) {
    从队列中获取任务
    执行任务
  } else {
    阻塞
  }
}

管理异步代码

在 JavaScript 中管理异步代码有几种不同的方法,包括:

回调函数

回调函数是异步操作完成后调用的函数。例如,以下代码片段使用回调函数来处理 setTimeout() 函数的异步操作:

setTimeout(() => {
  console.log("Hello, world!");
}, 1000);

// 回调函数
function callback() {
  console.log("异步操作已完成");
}

setTimeout() 函数执行后,它会调用 callback() 函数。

Promise

Promise 是表示异步操作最终结果或状态的对象。Promise 可以处于以下三个状态之一:

  • Pending: 操作正在进行中。
  • Fulfilled: 操作已成功完成。
  • Rejected: 操作已失败。

以下代码片段使用 Promise 来处理 setTimeout() 函数的异步操作:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Hello, world!");
  }, 1000);
});

// 使用 then() 方法处理已完成的 Promise
promise.then((result) => {
  console.log(result);
});

setTimeout() 函数执行后,它会调用 resolve() 函数,将 "Hello, world!" 作为参数传递。这会将 Promise 的状态更改为 Fulfilled ,并触发 then() 方法。

async/await

async/await 是 ES2017 中引入的语法,它允许您以更同步的方式编写异步代码。以下代码片段使用 async/await 来处理 setTimeout() 函数的异步操作:

async function main() {
  const result = await setTimeout(() => {
    return "Hello, world!";
  }, 1000);

  console.log(result);
}

main();

async 函数返回一个 Promise,await 等待 Promise 完成。当 setTimeout() 函数执行后,它会将 "Hello, world!" 返回到 result 变量中,这将触发 console.log() 语句。

结论

在 JavaScript 中,同步操作立即执行,而异步操作非立即执行且不会阻塞主线程。JavaScript 引擎使用事件循环来管理同步和异步代码的执行。有几种方法可以管理 JavaScript 中的异步代码,包括回调函数、Promise 和 async/await。通过理解这些概念,您可以有效地编写利用 JavaScript 异步编程功能的应用程序。