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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。