JavaScript 是一种单线程的编程语言,这意味着它一次只能执行一个任务。然而,JavaScript 通过异步编程和并发模型提供了强大的非阻塞能力,使得在等待某些操作完成(如网络请求、文件读写等)时,可以继续执行其他代码。以下是一些常见的异步和并发用法:
-
回调函数:这是异步编程的基本形式,一个函数在执行完毕后通过回调函数继续执行。
function doSomethingAsync(callback) { setTimeout(() => { console.log('异步操作完成'); callback(); }, 1000); } doSomethingAsync(() => { console.log('已执行回调'); }); -
Promise:Promise 对象代表了一个异步操作的最终完成(或失败)及其结果值。
function doSomethingAsync() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('异步操作完成'); }, 1000); }); } doSomethingAsync().then(result => { console.log(result); // '异步操作完成' }); -
async/await:这是基于 Promise 的更现代的异步编程方式,使得异步代码看起来像同步代码。
async function doSomethingAsync() { return new Promise((resolve, reject) => { setTimeout(() => { resolve('异步操作完成'); }, 1000); }); } async function asyncCall() { console.log('Before async call'); const result = await doSomethingAsync(); console.log(result); // '异步操作完成' console.log('异步调用后'); } asyncCall(); -
并发执行:可以使用
Promise.all来并发执行多个异步操作,并等待它们全部完成。function asyncOperation(i) { return new Promise(resolve => setTimeout(() => resolve(`返回值 ${i}`), 1000)); } Promise.all([asyncOperation(1), asyncOperation(2), asyncOperation(3)]) .then(results => { console.log(results); // ['返回值 1', '返回值 2', '返回值 3'] }); -
事件循环:JavaScript 的运行机制允许在等待异步操作时处理其他任务,这是通过事件循环实现的。
-
Web Workers:对于需要大量计算的任务,可以使用 Web Workers 来在后台线程运行 JavaScript,避免阻塞主线程。
-
Node.js 流:在 Node.js 中,流(Streams)是一种允许你处理数据流的方式,可以是可读流(从一个地方读取数据)或可写流(向一个地方写入数据)。
-
Node.js 集群:Node.js 的集群模块允许你创建多个 Node 进程来利用多核服务器,每个进程都可以处理多个请求。
使用这些技术,JavaScript 开发者可以编写高效、响应式的应用程序,即使在单线程环境中也能处理大量并发任务。