📜  JavaScript 中的同步和异步(1)

📅  最后修改于: 2023-12-03 15:01:40.472000             🧑  作者: Mango

JavaScript 中的同步和异步

JavaScript 是一门单线程语言,意味着它只能同时执行一个任务。这意味着 JavaScript 阻塞或延迟长时间的IO操作和其他任务,从而降低了应用程序的性能。JavaScript 发明人 Brendan Eich 提出了一种名为“事件循环”的解决方案,以克服这个问题。

同步和异步

JavaScript 中可以分为同步和异步代码。同步代码是按照它们编写的顺序执行的,直到这些代码完成。异步代码则与同步代码不同,可以在其他代码执行时并行执行。

同步代码示例
function process() {
  console.log('开始执行');
  console.log('处理中');
  console.log('执行完毕');
}
process();

输出结果:

开始执行
处理中
执行完毕

上面的 process() 函数是同步代码。

异步代码示例
console.log('开始执行');

setTimeout(() => {
  console.log('处理中');
}, 1000);

console.log('执行完毕');

输出结果:

开始执行
执行完毕
处理中

上面的代码中 setTimeout() 是异步代码,通过传入回调函数和延迟时间,它不会立即执行,而是在 1 秒后执行回调函数。

回调函数

异步代码通常需要回调函数,以便在操作完成时执行。回调函数可以作为参数传递给其他函数或方法。

function asyncProcess(callback) {
  setTimeout(() => {
    callback();
  }, 1000);
}

function doSomething() {
  console.log('完成回调函数');
}

asyncProcess(doSomething);

上面的代码中,asyncProcess() 方法具有回调函数,它在异步代码完成时执行传入的回调函数。

Promise

Promise 是一种在 JavaScript 中实现异步编程的方法。它可以代替回调函数,使代码更加清晰和易于阅读。Promise 可以包含三种状态:pendingfulfilledrejected

创建 Promise
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('操作成功');
  }, 1000);
});

上面的代码中,promise 在 1 秒后执行,成功时调用 resolve() 方法,并传递值 "操作成功"

处理 Promise
promise
  .then((result) => {
    console.log(result); // 操作成功
  })
  .catch((error) => {
    console.log(error);
  });

上面的代码中,.then().catch() 方法都返回一个新的 Promise,它们可以链式调用。当 Promise 的状态为 fulfilled 时,执行 then() 方法的回调函数,否则执行 catch() 方法的回调函数。

async/await

async/await 是一种异步编程模式,它是通过 ES2017 引入的语言特性。它使用 asyncawait 关键字来处理 Promise。

async

async 关键字用于异步函数的声明。异步函数返回一个 Promise 对象。

async function fetchData() {
  const response = await fetch('/data.json');
  const json = await response.json();
  return json;
}

上面的代码中,fetchData() 使用 await 关键字处理 Promise,当其中的 Promise 完成时,执行函数的下一步。函数返回从 Promise 获取到的 JSON 数据。

await

await 关键字只能出现在异步函数中,并暂停异步函数的执行,直到 Promise 完成或拒绝。

const data = await fetchData();
console.log(data);

上面的代码中,await 暂停代码执行,直到 fetchData() 函数返回 Promise 对象。当 Promise 完成后,await 继续执行代码并返回从 Promise 获取到的数据。

总结

JavaScript 中的同步和异步代码都,可以使用回调函数、Promise、async/await 进行处理。选择正确的技术可以使我们更有效地管理异步操作,从而改善应用程序的性能和可维护性。