📅  最后修改于: 2023-12-03 15:01:40.472000             🧑  作者: Mango
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 是一种在 JavaScript 中实现异步编程的方法。它可以代替回调函数,使代码更加清晰和易于阅读。Promise 可以包含三种状态:pending
、fulfilled
和 rejected
。
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('操作成功');
}, 1000);
});
上面的代码中,promise
在 1 秒后执行,成功时调用 resolve()
方法,并传递值 "操作成功"
。
promise
.then((result) => {
console.log(result); // 操作成功
})
.catch((error) => {
console.log(error);
});
上面的代码中,.then()
和 .catch()
方法都返回一个新的 Promise,它们可以链式调用。当 Promise 的状态为 fulfilled
时,执行 then()
方法的回调函数,否则执行 catch()
方法的回调函数。
async/await 是一种异步编程模式,它是通过 ES2017 引入的语言特性。它使用 async
和 await
关键字来处理 Promise。
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
关键字只能出现在异步函数中,并暂停异步函数的执行,直到 Promise 完成或拒绝。
const data = await fetchData();
console.log(data);
上面的代码中,await
暂停代码执行,直到 fetchData()
函数返回 Promise 对象。当 Promise 完成后,await
继续执行代码并返回从 Promise 获取到的数据。
JavaScript 中的同步和异步代码都,可以使用回调函数、Promise、async/await 进行处理。选择正确的技术可以使我们更有效地管理异步操作,从而改善应用程序的性能和可维护性。