nodejs异步处理并发,node 异步

  nodejs异步处理并发,node 异步

  有了异步I/O,必然有异步编程!今天就来学习Node.js的异步编程吧!

  node.js速度课程简介:进入学习

  

异步编程概述

  在同步I/O的影响下,曾经的单线程模式由于I/O调用缓慢导致CPU和I/O在应用级无法重叠。为了照顾程序员的阅读习惯,同步I/O盛行了很多年。[推荐研究:《nodejs 教程》]

  但是有很大的性能问题!

  使用Node JavaScript及其内部异步库,异步被直接提升到业务层面。Node带来的最大特点是事件驱动的非阻塞I/O模型。非阻塞I/O可以使CPU和I/O不互相依赖等待,更好地利用资源。

  

异步编程解决方案

  目的:读取package.json中主字段对应的文件内容

  Callback

  对异步I/O操作使用回调函数。

  const fs=require( fs );

  fs.readFile(。/package.json ,{ encoding: utf-8 },(err,data)={

  if(err)throw err;

  const { main }=JSON . parse(data);

  fs.readFile(main,{ encoding: utf-8 },(err,data)={

  if(err)throw err;

  console.log(数据);

  });

  });

  问题:如何解决回调地狱?

  Promise

  Promise是一个有限状态机,有四个状态,其中三个核心状态是待定和已履行(

  完成),被拒绝,存在未打开状态。

  具体可以参考我之前的博文《承诺》。

  使用Promise读取package.json中主字段对应的文件内容

  const { readFile }=require( fs/promises );

  readFile(。/package.json ,{ encoding: utf-8 })。然后((res)={

  返回JSON . parse(RES);

  })。然后((数据)={

  返回readFile(data.main,{ encoding: utf-8 });

  })。然后((res)={

  console . log(RES);

  });对比前面使用回调的解决方案,我们可以看到没有嵌套回调,异步操作是通过一系列的链式调用来处理的。

  Callback 转为 Promise

  如何把回调变成承诺?

  您可以使用Node附带的实用函数util.promisify。

  您可以自己实现它:

  函数promisify(fn,接收器){

  返回(.args)={

  返回新承诺((解决,拒绝)={

  fn.apply(接收方,[

  .参数,

  (错误,结果)={

  返回错误?reject(err):resolve(RES);

  },

  ]);

  });

  };

  }

  const readfile promise=promisify(fs . readfile,fs);await

  Await函数使用try catch来捕获异常(注意并行处理)。

  const { readFile }=require( fs/promises );

  const start=async ()={

  const { main }=JSON.parse(

  等待readFile(。/package.json ,{ encoding: utf-8 })

  );

  const data=await readFile(main,{ encoding: utf-8 });

  console.log(数据);

  };

  start();await的语法像同步编程一样编写。这里的操作是串行操作,会逐行等待执行。

  如果几个任务能并行,这样写就不太好了。是的,我们可以使用Promise.all来操作并行任务。

  这里还会有一个小问题。课后问了老师,这是老师的回答。

  [Q]在异步块中,当谈到串行和并行时,我在并行处理块中有一个问题。如果并行场景要求每一个异步任务都要执行,不管其他任务的成败,最后错误都要统一处理,那么使用Promise.all处理多个异步任务时,遇到执行错误会返回第一个任务。如何才能让所有任务都完成,然后统一处理错误?

  [A] Promise.all处理多个请求。当所有请求都成功时,resolve返回一个数组,其中包含执行结果。如果一个请求失败,立即拒绝错误,所以我们不能用Promise.all来实现这个地方。承诺有一个固定的方法,developer.mozilla.org/en-US/docs/…

  Event

  订阅模式,Node.js内置事件模块

  例如HTTP服务器上的(‘请求’)事件监控

  const event emitter=require( events );

  MyEmitter类扩展了EventEmitter {}

  const my mitter=new my mitter();

  我的密特。on( event ,()={

  console.log(发生了一个事件!);

  });

  我的密特。发出( event );

  const http=require( http );

  const server=http。创建服务器((req,res)={

  res.end(你好!这是YK!);

  });

  server.on(request ,(req,res)={

  控制台。日志(请求。网址);

  });

  服务器。听(3000);

  更多编程相关知识,请访问:编程视频!以上就是深入了解节点。射流研究…中的异步编程,分享四种解决方案的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: