返回

JS的继发与并发有何区别?全面了解两种异步执行关系

前端

继发关系与并发关系的对比

特征 继发关系 并发关系
执行顺序 一个异步操作完成后,另一个异步操作才会开始执行 两个或多个异步操作可以同时开始执行
代码编写 通常使用回调函数、Promise或async/await来实现 通常使用并行编程技术,如多线程或多进程来实现
适用场景 需要保证异步操作的执行顺序时 需要提高程序的执行效率时
优缺点 执行顺序可控,易于调试 执行效率高,但代码编写复杂,难以调试

继发关系的实现

继发关系通常使用回调函数、Promise或async/await来实现。

回调函数

回调函数是JavaScript中常用的异步编程技术。当一个异步操作完成后,会调用回调函数来处理异步操作的结果。

function fun1(callback) {
  setTimeout(() => {
    console.log('fun1');
    callback();
  }, 1000);
}

function fun2() {
  console.log('fun2');
}

fun1(fun2);

在上面的代码中,fun1()是一个异步操作,它会调用fun2()作为回调函数。当fun1()执行完成后,它会调用fun2()来处理异步操作的结果。

Promise

Promise是JavaScript中另一个常用的异步编程技术。Promise对象表示一个异步操作的最终完成或失败的状态。

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('fun1');
  }, 1000);
});

promise.then((result) => {
  console.log(result);
});

在上面的代码中,promise是一个Promise对象,它表示一个异步操作的最终完成或失败的状态。当promise对象的状态变为完成时,它会调用then()方法来处理异步操作的结果。

async/await

async/await是JavaScript中一种新的异步编程技术。它允许您使用同步的语法来编写异步代码。

async function fun1() {
  const result = await new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('fun1');
    }, 1000);
  });

  console.log(result);
}

fun1();

在上面的代码中,fun1()是一个异步函数,它使用await来等待promise对象的状态变为完成。当promise对象的状态变为完成时,它会继续执行后面的代码。

并发关系的实现

并发关系通常使用并行编程技术,如多线程或多进程来实现。

多线程

多线程是并行编程的一种实现方式。它允许一个程序同时执行多个任务。

const worker = new Worker('worker.js');

worker.postMessage('fun1');

worker.addEventListener('message', (event) => {
  console.log(event.data);
});

在上面的代码中,worker是一个Web Worker对象,它可以独立于主线程执行任务。当主线程调用worker.postMessage()方法时,它会向worker发送一个消息。worker接收到消息后,它会执行相应的任务。当worker执行完任务后,它会向主线程发送一个消息。

多进程

多进程是并行编程的另一种实现方式。它允许一个程序同时执行多个进程。

const child_process = require('child_process');

const child = child_process.fork('child.js');

child.send('fun1');

child.on('message', (message) => {
  console.log(message);
});

在上面的代码中,child是一个子进程对象,它可以独立于主进程执行任务。当主进程调用child.send()方法时,它会向子进程发送一个消息。子进程接收到消息后,它会执行相应