JavaScript的异步与并发

59 阅读2分钟

JavaScript 是一种单线程的编程语言,这意味着它一次只能执行一个任务。然而,JavaScript 通过异步编程和并发模型提供了强大的非阻塞能力,使得在等待某些操作完成(如网络请求、文件读写等)时,可以继续执行其他代码。以下是一些常见的异步和并发用法:

  1. 回调函数:这是异步编程的基本形式,一个函数在执行完毕后通过回调函数继续执行。

    function doSomethingAsync(callback) {
        setTimeout(() => {
            console.log('异步操作完成');
            callback();
        }, 1000);
    }
    
    doSomethingAsync(() => {
        console.log('已执行回调');
    });
    
  2. Promise:Promise 对象代表了一个异步操作的最终完成(或失败)及其结果值。

    function doSomethingAsync() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('异步操作完成');
            }, 1000);
        });
    }
    
    doSomethingAsync().then(result => {
        console.log(result); // '异步操作完成'
    });
    
  3. 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();
    
  4. 并发执行:可以使用 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']
        });
    
  5. 事件循环:JavaScript 的运行机制允许在等待异步操作时处理其他任务,这是通过事件循环实现的。

  6. Web Workers:对于需要大量计算的任务,可以使用 Web Workers 来在后台线程运行 JavaScript,避免阻塞主线程。

  7. Node.js 流:在 Node.js 中,流(Streams)是一种允许你处理数据流的方式,可以是可读流(从一个地方读取数据)或可写流(向一个地方写入数据)。

  8. Node.js 集群:Node.js 的集群模块允许你创建多个 Node 进程来利用多核服务器,每个进程都可以处理多个请求。

使用这些技术,JavaScript 开发者可以编写高效、响应式的应用程序,即使在单线程环境中也能处理大量并发任务。