00:00
好,那刚才我们这说了一个这个同步文件写入,其实我们这种同步代码的都是非常简单的,为什么简单的,因为它都是什么呀,顺序执行的什么意思呀,它是一行一行去执行,对吧?我们按照正常的思路去写就OK了啊写就OK了,那我们接下来来看什么呢?我们的异步文件写入来,这边直接写了异步文件写入来,那我们来说一下这个异步文件写入怎么写,那其实我要写入的话,其实还是一个一个道,还是先要干嘛呀,先要打开文件啊,来异步文件写入,我们来写一下这块我需要先干嘛呢?先引入我们FS模块啊,直接Y一个FS等于这个块一个这个FS,先引入FS模块,然后在这三个步骤,第一个是干嘛呀,打开我们这个。
01:00
文件,但是之前我用的是这个open snc对吧?哎,SC,那在这里边我们可以改成什么了,诶就直接就是一个open啊,这是我们异步写入的方法,来我们来把这个方法来看一下,直接叫做FS,点一个这个open,其实你会发现它的参数和我们那个参数几乎是一致的,就多了一个谁啊扣back啊,就多了一个扣back啊,那这一块我们来看怎么写了,在这块我粘过来叫做一个open,这个方法来说一下,它用来干嘛呢?用来打开一个什么呀,打开一个文件,那我们会发现参数pass,这我们是不是都不用说了,哎,都不用说了,其实是一样的啊,比如说打开文件,这里边第一个是一个路径啊,路径第一个叫做hello.t或者hello2.t一样的,第二个参数是我们的一个操作的一个什么呀,操作一个标志,我这还。
02:00
还什么呀,写还是什么呀,W啊还是W,然后呢,第三个这个model我一般都是省略不写的啊,不写的,然后最后一个那注意了,那其实我这么一写跟我刚才那open snc是不是一样的呀,哎,我就这样执行,我们看效果啊,我对于执行这块干嘛了,诶报错了,那意思这个不函数还不行啊,哎叫argument must be function是不是必须是个函数啊,哎,不说函数,那也就是说函数这个能不能省略啊,不能省略,所以这我还得传一个这个function回调函数,我先传上吧,哎先传上来,我在这运行一下走你。文件是不是也有了,哎,也有了,哎,所以你会发现除了多一个回调函数,其他的是没有看出什么区别啊,但是问题来了,是不是问题,我这打开文件,我是不是需要一个文件的标识符啊,我那个FD对吧?FD那现在我这有吗?他问你我能挖上一个FB吗?能不能,能不能。
03:08
行不行,用不用是l.log fd,你看如果要真有FD的话,我这方法又变成什么了?是不是又变成同步的方法了,所以FD压根就不可能有值,它肯定是按第三的,能懂这意思吧,所以注意异步方法不可能有返回值,只要有返回值肯定是同步的,为什么呀?因为意味着我说必须等等它返回结果,我下边是不是才可以执行啊,只要有返回值肯定是同步的,那问题来了,那这个FD到底从哪返回啊?看有什么,是不是有回调函数啊,哎,回调函数,所以注意我们的什么呢?我们的异步调用的方法,这个结果都是什么呢?都是通过这个回调函数返回的,都是通过回调函数,那同学说了回调函数怎么。
04:08
啊。回个函数如法回调函数它在掉的时候,首先我们要确定一点,回调函数掉没掉,掉没掉,我来一个CANCEL123掉没掉,哎,我们这运行走你掉没掉掉了,诶那掉的时候它怎么能通过回调函数来把这个结果给我返回啊。怎么通回函数反应结果,回调函数里边是不是应该有参数啊,哎,有参数,所以注意我们要看的就是这个argument,我们看看arguments里边有没有注意啊,所以注意啊这一块我们说了结果都是通过回调函数的这个,哎,参数返回的啊,参数返回的那我们来看阿根直接运行我们来看诶刘姐两个第一个是no,第二个是什么呀,33,那这三很明显,这肯定是那个什么呀,是不是FD文件的描述符啊,那第一个是什么呀?那这块我们来说一下我们这个啊以以后只要用到回调函数了,你先要确认回调函数里边有哪些参数啊,参数,而我们这个回调函数有两个参数,哎,有两个参数,第一个我们叫做一个error error。
05:33
I什么意思呢?叫做错误对象啊,错误对象第二个我们叫什么呢?叫做FD是我们这个文件的一个描述符啊描述符,那这错误对象是干嘛的?这个对象如果没有错误则什么呢?则为no,如果没有错误则为no,那这个也是我们note GS一个设计思想叫什么呢?叫做错误优先,什么叫错误优先,只要有可能出现异常的这个方法,它在回调函数第一个参数一定是什么,一定是error,一定是error,为什么?
06:10
因为出错了,是不是意味着我这块执行出问题了,出错了我说要对这个错误进行处理啊,所以它的第一个参数一定是error,所以这两个参数我们给定个名儿叫做error,一个叫做FD,当然这名你说是不是非得叫这个呀,不是啊,叫啥都行啊,叫啥都行,那在这儿呢,我们可以来做一个判断,我先干嘛呢?我可以判断是否出错,怎么判断,直接一个if否error,如果error存在代表什么?出错啊,出错了,好,那我取个反表示什么,哎,是不是没出错啊,所以如果error不存在,是不是代表没出错啊,没出错在这儿我就来干嘛呢?来一个cancel log一个FD直接运行走,你是不是就出来一个三呀,来出一个三,那什么时候出错啊。把W改成R,改成R呢,改成R,然后啊,我把文件给他删了。
07:08
把文件给它删了啊,我们来看效果在这儿我来运行一下走你这出没出理三没出三没出三证明什么证明出错,那这块我们来一个else else我来什么呢?cancel.log一个error,输出一下这个错误直接运行来看什么。没有这个文件或者文件夹了,说白了你这写一个只读要读这个文件,但是他读的时候发现文件干嘛呀,不存在,在这儿他就报错了呀,所以通过这种方式,我们就可以对我们这个错误是不是进行一个。处理啊,哎,进行一个处理啊,然后我这如果改成W这一保存。还出不出头就不出头了啊,所以这个是我们异步的打开文件的方法,看明这意思吧,唯独的区别就是结果是通过回调函数返回的,而不是通过返回值啊,而不是通过返值。好接下来打开文件以后,我该干嘛了,我是不该写了,写我们要调的是谁?调的是我们叫做一个FS点,一个right right我们来找到我们这个right方法,Right方法其实你会看到跟那个参数也是一样的,唯独是不是也是多了一个回调函数啊,它干嘛呢?诶用来异步写入一个文件啊,用来异步写入一个文件,好那我现在说一下怎么叫参数,第一个FD,第二个要写入的内容,最后一个是不是我们这个,哎,那这块我直接调,那我这FS点在哪调啊,我在这调行不行?
08:49
行不行?看不见FD对吧,看不见FD那怎么办?哎,那我干嘛,诶我说我这么写行不行,看着啊,我这来一个挂一个这个FD,然后呢,我在这儿干嘛呢,来一个FD,诶这个这样写呢,还还不行,因为这俩名是不是一样啊,一样的看它它这个它里边有,他就不看外边这个对吧,所以这块还得换一个名,换一个fdfd out吧,就叫F吧,换一个变量叫,然后在这儿呢,我就来一个F,等于FB我给它赋值这块我给它去了,问你在这我能不能看到这F。
09:39
能不能看到这F,我就问你这问题,F是按地的,还是真的有数,有数吗?换句话说就是问你这两行代码它的执行顺序是不是他先,是不是他先执行是不是,哎,来运行一下走。
10:03
啊,你发为啥呀。能看懂这意思吗?来看着啊,我改一个套路,我这写一个,我这写一什么呢?我这写一个,我们这个是open下的这个代码,这是open下的代码啊,然后这写一个来一个cancel.log这是什么呢?这是我们这个回调函数中的代码,我要问你谁先执行,是回调函数的代码先执行,还是open下代码先执行,哎,咱们来看效果,我直接运行是不是open下的先执行,然后回调函数后执行,为什么呀。我们说了叫异步的IO,也就是说我这个open的操作会不会阻塞下边程序执行,不会,所以这块open的时候,其实就是干嘛呢?我把这个操作交给后台的IO线程池了,由这个IO线程池去做这个什么呀,打开文件的操作,它操作完了以后呢,再通过回调函数干嘛呀,返回,再通过随调函数返回,所以当回调函数执行的时候,代表文件干嘛了,已经要读完了,能懂这意思吗?所以它执行顺序是什么呀?先执行这个,然后执行什么呀?FS open,那这个东西就交给什么了,后台携程池了,然后我再去往下执行cancel log,那这什么时候执行啊?
11:31
等文件操作完了以后,是不是才会执行啊,所以注意回调函数的代码是先执行后执行后执行的,所以在这你去打印F的时候,这个F有值吗?没值,因为这个还没有执行,看懂这意思了吧,所以这里边注意可不能这么写,那要怎么写,哎,那我就需要在哪啊,在我的回调函数里边写,哎这块如果没有出错,则什么呢?则对我们这个什么呢?哎,对我们这个文件进行写入操作,写入操作这块我直接调一个FS,点一个right,第一个传一个FD,那这个时候这F1是不是就肯定有了,哎,肯定有了,然后第二一个我们是要传一句这个话来,我写什么呢?我写一个,哎,这是我们义步写入的内容,哎写的内容好,写这么一句话,然后第三一个我还要写什么呀。
12:32
给一个回调函数啊,方个人注意了,这个回调函数里边还有没有什么FD了,没有了,因为它不需要反FT吧,所以它只会有一个什么呀,Error,它就一个参数是谁呀,Error error干嘛的?哎,让我们看到底有没有错,所以这我来一个if,如果没错,我就输出一个cancel.log一个干嘛呢?写入。成功啊,洗漱成功这一保存,那同样可能会说了。
13:03
老师,这东西里边有啥参数,我这是不是也不知道啊,你怎么办呀?来我们这是不是有文档啊,文档我们来看看,他这个扣back在这儿呢,应该是再往下写,诶这还不是说一个参数干嘛呀,它这有三个参数啊,第一个是error,第二一个是什么呀?Written,哎,Written表什么意思呀,被写入了多少字节,第三一个是什么呀?String,哎,这是什么呀?写入的内容吧,哎,写入内容,但是这两个参数对于我们这块来说有没有什么意义啊,没有什么意义,其实我们来说是不是只需要知道有没有写入成功啊,至于写入多少,我们是不是都在这儿去控制的啊,在这去控制啊,那这块我们直接来看吧,这个error直接来运行一下,所以注意啊,参数干嘛通过文档就可以来看了,或者你打印一下argument自己来看一下也OK啊也OK,好在这儿我们来运行一下,直接走。
14:02
干嘛写入成功?再看哈尔的题。是不是就写入了,哎,就写入了啊,那这个就是我们说的一个E写入好,写入完了又该干嘛了,是不是要关闭呀?哎,写入完事以后,我们要对文件进行关闭,关闭哪关。我是不是只要回调函数一执行,我是不是就应该关闭文件呀?哎,那这我来干嘛呢?在这儿我来一个关闭,关闭我们这个文件怎么关,我们有一个方法叫做FS点一个close FS一个close,那这块其实就很简单了,就多了一个回调函数,而且它这回调函数我们来看它这呢。异步的close完成回调只有一个可能的什么呀,异常参数它是只有一个error,其他的全没有好,我们这粘过来叫做一个FS,一个close干嘛呢?这也是用来哎关闭我们这个文件啊,关闭文件好,那在这我调一个FS,点一个这个close,传一个FD,然后来一个什么呢?Function,然后就一个什么呀,Error这儿来一个这个if,如果干嘛呢?如果没有错,我就来一个叫做cancel.log,一个叫做文件也关闭,但是这个东西其实输不输都行啊,我们在打印一个结果,这一保存,然后一运行写入成功,然后文件一关闭,这完整的流程干嘛了就完成了,看懂这意思了吧,哎,那所以这就是我们的一个异步的一个写入,哎,简单吧。
15:46
哎,比我们这个同步笔怎么样。是不是太麻烦了,哎,太麻烦了,那这就是我们异步的一个,它的是一个双刃剑,首先异步的性能会比我们那个同步好一点,为什么呢?因为异步不会阻塞我们程序的一个进行,所以在这儿你看啊,我来一个这个cancel.log一个什么呢?一个这个程序干嘛呢?程序向下执行,你会发现什么呢?你会发现我第42行代码永远是肯定在他们两个之前去执行的,因为它是一个异步的,能理解吧,城墙执行,这就相当于什么呀,相当于我在这儿点完鱼香肉丝,然后干啥呀。
16:27
我是不是干别的事去了,等他把饭做好了,是不是他给我返回过来啊,哎,反应过来它是一个异步的,而我们之前这个代码虽然简单,但是它是一个什么呀,同步的,也就是说我假如说这还有一行代码,CTRLC,我在这还有一行代码,这行代码得什么时候是,诶得等他们都完成了以后,我是不是最后才执行啊,哎,所以他们就这么一个这么一个特点,一个是异步的一个事儿同步的,但是同步它有什么特点,同步符合我们人类的思维。对吧,我们人类的正常思维都是干完一件事儿干嘛呀,再干一件事儿,所以编程起来比较简单啊,比较简单,而异步操作干嘛呀,它不符合我们人类的思维习惯,所以编程起来,编起就是程序写起来会比较什么呀,比较复杂,但是性能相对来说好一点,但是你就会发现麻烦在哪儿,你看我这一个回调函数,这回调函数里边又套了一回调,回调里边干嘛呀,又套一回调,比如说回调里边套回调是不是再套回掉,如果套的多了还有可能再套,哎,所以这块就是什么呀,代码的可读性干嘛呀,稍微差一点啊,稍微差一点,编辑起来比较麻烦一点,但是这就是我们note夹里边一个什么呀。
17:40
特色,当然待会我们还说一些简单的方式,但是这种方式你要给他整明白了啊,整明白了,然后还有一点,为什么同步比异步简单,因为同步这个代码我没写完整,为什么没写完整,在这儿我有没有考虑出现异常的情况没有,所以在同步代码里我并没有出处理异常,所以它是有隐患的,什么隐患假如说有一个运行出错了,整个程序就干嘛了,就废了,就会终止,而我们在这儿出不出异常没关系,出异常只他自己出错,别的程序干嘛呀,不会有影响,所以这个程序也更加的什么呀严谨一些,而我们如果在同步这处理处理异常的话,会变得非常的。
18:29
麻烦啊,非常的麻烦,所以你们要做的是把这个代码自己尝试去写一下,非常的麻烦,但是呢,你要自己去看一下每一步,每一步都是干嘛的啊,都是干嘛的,好,我们来听一下。
我来说两句