JavaScript 中应用异步编程方法防止堵塞 UI 进程

lxf2023-12-16 12:10:01

进程和线程全是电子计算机里的定义,用以叙述程序执行后的运作企业。

过程是指后台运行程序的案例,包含编程代码、数据信息、局部变量和资源等。 每一个过程都拥有独立的地址空间,因而不一样过程中间的信息没法访问外网,只能依靠进程间通信的形式进行互动。

进程是进程中的一个执行装置,一个过程能够包括好几个进程,每一个线程共享进度的地址空间与资源,可是拥有自己局部变量和执行状态。 不一样进程中间能够访问外网同一进度的数据信息,因而线程间通信方便快捷,但还需要注意线程同步和相互独立难题。

在 JavaScript 中,进程和线程这个概念并不会直接曝露给开发者的,而是用电脑浏览器或 Node.js 等实行自然环境来完成的。

用浏览器中,JavaScript 是单核的,换句话说全部 JavaScript 编码都运作在同一个进程中,这一进程被称作“UI 进程”或“主线程”。 这一进程负责管理用户交互事情、升级 UI 页面、实行 js 编码等相关工作。假如 js 执行命令时间太长,也会导致网页页面发生“诈死”或“卡屏”状况,因而必须采用异步编程的方式去防止这样的事情。

在 JavaScript 中,常见的异步编程方法有调用函数、Promiseasync/await 等。这种方法能够让 js 编码异步执行,进而尽量避免堵塞 UI 进程。

在 Node.js 中,JavaScript 使用的是根据量化策略和非阻塞 I/O 模型,换句话说,这是根据单核的,可是能通过多线程 I/O 和量化策略来达到分布式系统。在 Node.js 中,能通过 child_processcluster 控制模块来建立子进程,完成多线程的方式去提升流程的高并发特性。


下边要在 JavaScript 中应用异步编程方法防止堵塞 UI 进程的事例:

// 应用调用函数的形式异步加载照片
function loadImageAsync(url, callback) {
  var img = new Image();

  img.onload = function() {
    callback(null, img);
  };

  img.onerror = function() {
    callback(new Error('Could not load image at '   url));
  };

  img.src = url;
}

// 启用异步函数上传图片并升级 UI
loadImageAsync('https://img.adminjs.cn/d/file/0422/2239471eunshw51ca.jpg', function(err, img) {
  if (err) {
    console.error(err);
  } else {
    document.body.appendChild(img);
  }
});

上边代码根据调用函数的方式进行了异步加载照片,防止了长期堵塞 UI 进程。


下边要在 Node.js 选用 child_process 控制模块建立子进程的事例:

const { spawn } = require('child_process');

// 建立子进程并运行命令
const child = spawn('ls', ['-lh', '/usr']);

// 监视子进程输出
child.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`child stderr:\n${data}`);
});

// 监视子进程的关掉事情
child.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

在后面的实例中,大家创建了一个子进程,并在这其中实行 ls -lh /usr 指令。还监视子进程输出或关闭事情。在执行过程中,子进程输出要被打印出到控制面板,并且在子进程撤出时导出子进程的撤出编码。

留意,接下来我们采用的是 Node.js 的 spawn 方式,这是多线程的。还有一个 exec 方法来实行同步DOS命令,可是在实施长期运转的任务后可能堵塞主进度的实行。


总体来说,JavaScript 里的进程和线程定义也是通过实行自然环境来完成的,而非立即曝露给开发者的。开发人员应该根据实际需要选择适合的编程模型,从而达到最合理的性能高并发实际效果。与此同时,大家还要注意异步编程的有关技术和并发控制问题,以保证程序流程的准确性和性能。

本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!