当前位置: 首页 > 后端技术 > Node.js

如果继续发烧,试试Dart语言的异步操作,效率提升500%

时间:2023-04-03 11:47:00 Node.js

前言昨天发了一篇文章《Dart开发服务端,我是不是发烧(骚)了》,感谢小编在首页看到了。今天继续发烧,接下来写一下如何使用Dart语言的异步操作。说起异步操作,玩NodeJS的同学都会会心一笑,这就是我们的看家本领。玩PHP和JAVA的同学也看看,说我们只看不说。在代码演示之前,我们先假设一个场景。假设我有一些漂亮的姐妹,我很有创意,想给她们发一封电子邮件来表达我的爱。在这个过程中,代码需要做的事情:接收一个请求,将我的邮件内容保存到数据库中,并将邮件内容发送到他们的邮箱中。在返回结果的过程中,我很在意发邮件需要多长时间,因为我的姐妹太多了,如果发邮件的时间太长,我就顾不上其他人了.以上4个步骤中,哪些步骤需要时间?显然,1和4基本是绝对耗时的,2需要一些时间,但是时间很短,3需要的时间最长,因为涉及到网络传输,不可控因素太多。什么是同步代码?下面我们用同步代码来模拟一下上面的过程。假设将信息保存到数据库需要1秒,发送邮件到对方邮箱需要5秒,那么整体时间应该是6点多。导入'dart:io';main(){acceptRequest();//接受请求saveToDb();//保存到数据库,不会太耗时,假设需要1秒sendLetter();//发送邮件到对方邮箱,非常耗时,假设需要5秒returnRes();//返回结果}voidacceptRequest(){print(DateTime.now().toString()+'接受请求');}voidsaveToDb(){sleep(Duration(seconds:1));print(DateTime.now().toString()+'保存数据库成功');}voidsendLetter(){sleep(Duration(seconds:5));print(DateTime.now().toString()+'邮件发送成功');}voidreturnRes(){print(DateTime.now().toString()+'返回结果');}执行得到打印出来的结果2021-06-2916:40:44.993785接受请求2021-06-2916:40:46.000240保存数据库成功2021-06-2916:40:51.002400发送邮件成功2021-06-2916:40:51.002400返回结果简单计算一下,从接受请求到返回结果大约需要6秒,符合预期。异步代码是什么样的?刚才说了,我有很多漂亮的姐妹,所以一封邮件要这么久。这么多姐妹要多久?你能快点吗?当然,代码如下:main()async{acceptRequest();//接受请求awaitsaveToDb();//保存到数据库,不太耗时,需要1秒sendLetter();//发送邮件到对方邮箱,非常耗时,需要5秒returnRes();//返回结果}voidacceptRequest(){print(DateTime.now().toString()+'acceptrequest');}voidsaveToDb()async{awaitFuture.延迟(持续时间(秒:1));print(DateTime.now().toString()+'数据库保存成功');}voidsendLetter()async{awaitFuture.delayed(Duration(seconds:5));print(DateTime.now().toString()+'发送邮件成功');}voidreturnRes(){print(DateTime.now().toString()+'返回结果');}执行得到打印结果2021-06-2916:47:46.931323接受请求2021-06-2916:47:47.956545保存数据库成功2021-06-2916:47:47.959539返回结果2021-06-2916:47:52.960542发送邮件successful这个结果,需要注意一下。有两点需要特别注意:从收到请求到返回结果,发送邮件成功用时1秒左右,但出现在返回结果后面。为什么相隔5秒?其实这就是Dart语言异步操作的魅力所在。默认情况下,Dart按代码顺序执行任务。但是执行sendLetter的时候发现是async异步操作,暂时不用等待,直接跳过,后面执行returnRes,所以在打印出返回结果后,如果是浏览器请求的话,那么浏览器请求直接结束。但事情还没有结束。Dart继续执行刚刚跳过的sendLetter,所以最终打印出邮件整体发送成功。这次发送邮件只用了1秒,而之前是6秒。这效率提高了,足足有500%ummm,真是太好了,可以照顾更多的妹妹了。awaitasync眼尖的同学大概都能看出来。在上面的代码中,main()async{acceptRequest();//接受请求awaitsaveToDb();//保存到数据库,不太耗时,需要1秒sendLetter();//发送邮件到对方邮箱,非常耗时,需要5秒returnRes();//返回结果}saveToDb保存数据库和sendLetter发送油价都是耗时操作,为什么在saveToDb之前加了await?这是因为saveToDb也是一个异步操作。如果不加await,会先跳过,就像sendLetter发邮件一样,浏览器返回结果后执行。这就产生了一个问题。如果写数据库失败了,你却已经告诉用户写成功了,那岂不是很尴尬?所以在saveToDb前面加了await,告诉Dart虽然这段代码是异步的,但是你必须同步执行。总结当一个操作非常耗时时,我们可以将其设置为异步async,先返回信息给用户,再慢慢处理。如果想把一个异步操作变成同步操作,可以加上关键字await,表示我愿意等待异步结果。Dart提供了异步操作的机制,我们可以很方便的使用。玩NodeJS的哭了,看家本领被偷了。