00:02
好,虽然说我们的客人说是要最后要去自定义啊,但前面的准备工作是非常关键的,其实前面都搞清楚了,自定义就没有多大难度啊。下面我们来看另外一个事情。我们开始也对它有一个理解,知道他状态改变,知道它基本怎么用,基本流程也清楚了。下面有一个问题我们要说一说,为什么要用promise来这里面我通过一段代码来说一下,这个代码呢?不需要写,其实也是官方文档上面的一些代码,我做了一些改变以后产生了一个代码。这个代码呢,不能完全执行,是个伪代码。好,我们来看一看为什么要用promise,其实实际上是要干嘛要将promise跟谁比?我们说promise是不是封装操作的,那以前没有promise以前是不是也可以做,以前我们说是不是用纯回调的形式去做的啊?
01:20
那从回调形式跟我们的promise promise有什么优势呢?我们要研究出这这个问题来看一下啊,可能大家现在只能出一句话,解决回调第一个问题啊,OK,我们来看一下啊,看一下他觉得有一个过程,你要把整个过程搞清楚。啊,就回到第一个问题了,是是一个点啊,只是一个点而已啊,来看一下。首先呢啊,我们现在它这个上面写的是我现在要去干个什么事情呢?要去创建一个音频文件,要去异步的创建一个音频文件,你要知道创建音频文件是不是要花一定的时间。
02:00
对吧,那我他第一步用的是纯回调的形式。就是有这样一个函数,那这个函数内部是不是去创建音频文件去,那你是不是要给它,它的第一个参数是你要去创建音频文件的一些配置信息,这个应该是个对象类型里面指定,比如说路径啊,内容是多少啊,对不对等等相关的信息,这是伪代码,这个代码是这个值是没有的,好,关键是下一个。你是不是要指定成功的回调和失败的回调,是不是你只有指定了成功的回调,将来他是不是才能调你,给你传入成功的结果,是不是同时你指定失败的回调,是不是将来是不是得到它传来一个错误的提示信息。是吧?注意,我们纯回调的形式,在你去调用真正的去执行异步操作之前,你就得指定。
03:03
你看我在执行这个函数的时候,就必须把这两个函数给他什么交给他。是不是这概念,当我去写这个代码执行它的时候,其实没有真正开始去做那个业务操作吧。就是我是先指定的回调函数,还是先启动的异步任务,是不是先一上来就指定的回调函数,后面是不是才启动异步任务。而且还必须是这样。我能不能说。等他完成之后,我再指定回调函数行不行,那不行,那他的完完成了,你指定回调函数已经得不到数据了。是不是概念啊,必须在真正去启动异步任务前去给他,交给他毁掉函数。没问题吧?好,下面我们来看promise的方式。
04:00
Promise方式,我这个里面有一个函数,这个函数呢,它返回一个promise对象,那这个我们说异步操作是不是在promise对象内部在执行。甚至不是,不就是那个执行器函数里面执行的吗,对不对。是不啊,那你说它内部这个函数内部是不是就在去执行异步任务。但是我问大家,此时此刻我有指定回调函数接收成功或者失败的数据吗?没有吧,但是我要问大家,义务任务在37行执行完之后有没有执行?有没有启动起来。说白了就这样一个事情,就这一个事情,大家明白,我六一个promise,我这个执行器里面是不是去执行异步任务,也就启动这个定时器吧,那我问大家,我在这写个打印输出对吧?再一个是new promise之后对不对,对不?那你说啊,我在这里面这也写个打印,看好了也写个打印,这个这个打印我可以说他在执行谁是不是执行执行器。
05:23
啊E执行器好,而执行器内部是不是启动义务任务去去处理,我要问大家事情就是这两个输出谁先执行,告诉我下面来上面的啊。哪个还有人说下面的呀。完蛋,没关系啊,我我就我就我我就抒发一下情感,大家看一下。什么意思,是不是执行器函数先执行,也就是说什么一个概念,你我要问大家,你说我这个执行器函数是同步回调还是异步回调,对很好,非常好。
06:19
那也就是说这个同这个执行器函数执行完,我的这个new promise这个函数是不是才结束。那也就是说,如果我现在都得到了一个promise对象呢?异步任务启动没有?我已经得到了一个对象,一步任务启动没有,当然启动了啦。对吧,启动了正在做的过程中啊,还没完成对不对,启动完成是他是要一定的时间的吧。对象啊,产生的时候啊,已经给你对象,也就是说我在这里已经得到了一个对象,那说明内部那个。
07:02
创建文件的操作是不是已经开始了,只是没有完成,对不对,因为这个返回很快,启动的操作很迅速。是不是?做要做一年的时间。那就说异步任务已经启动了,对吧。但是我此时有指定回调函数吗?没有,而我是不是在后面指定的回调函数,在后面定的回调函数,注意我正常情况下可能可能会这么写是吧,基本上是不是指定回调函数。是否?这一个是不是在异步任务启动之后指定的回调函数,但是是在异步任务成功或者说有结果之前指定的回调函数吧,是否?那我能不能在他有了结果之后才去指定呢?说白了就是说我假设举个例子啊,举个例子,我创建那个文件要两秒钟。
08:01
能理解吧,但是我指定回去好像是是三秒之后。请问我的回答数能不能得到结果?是能的。能得到结果。啊,能听懂吧,也就是说我的promise指定是要指定回调函数吧,但是指定的时机是可以在启动任务后,当然也可以在启动任务前,启动任务前那也是很自然的是不是。主要是可以在启动任务一步任务之后,甚至可以在任务什么完成结束之后,指定你能得到结果数据和以前的能行吗?能行吗?说不行。说白了一个意思,你看好了,看好啊,我做一下。我这里面买一个set out。我来个2000。这是不是说我指定回调函数是在成功或者失败之后才指定的,因为我成功失败只要一秒钟?
09:07
而我指定回调函数是什么?两秒之后是不是我是不是先有了结果,后面过了一段时间才指定的回调函数,那我能不能得到结果数据呢?刷新一下。Coming。可以看到没有,这个是不是比纯回调的提示要好,这是最最基本的认识,也就是说我们promise的方式有没有回调函数,有,但它相对于纯回调函数优势在哪里?它指定回调函数的方式更加的什么灵活,这是一个笼统的话,其实啊,看起来很专业是不是。
10:03
嗯,但是这个专业的话啊,并不一定能够完全的打动那个面试者。他可能会问你,你说的灵活指什么?具体指什么?我说上面一句话是想因为我下面说会说的很长,我先用一句简洁的话。来表达一下我的想法对不对啊,那具体灵活体现在哪呢?就是时间的问题。从回调的形式,它审核后指定回调函数。在启动什么义务任务前,是不是就指定了必须在这个时候吧,被限定死了。那而我们promise的可以在什么启动义务,一般是不是在启动义务任务之后,但是我能不能在有了结果之后才指定可以,比如说我其中一个任务开始我也不要结果,我也不知道他什么时候来结果,我过了三秒才取结果,信不信,可能三秒之内他早已经什么完了,有人说你晚,他完了以后你为什么不取结果呢?我那时候不需要啊。
11:09
是不是?能听懂吧,我其中一个发了一个请求,是不是发了请求,请求是不是花了很长时间,我也不知道他多长时间,是不是是吧。啊,我有,我拿到,我想去拿结果去写字,但是我想说我就过五秒之后。才去拿行不行?行吗?但是可能到了三秒,是不是请求就已经回来了,那个数据会丢掉吗?对呀,不会呀。当大家都在说回到地狱的时候,你要把这个说出来,很关键呢。是不是?啊,这是这个啊,我们指定回调函数的方式更加的什么灵活,当然你要说清楚灵活体现在哪,你不一定需要你说,可能你说这个以后呢,他就已经很满意了,那你就可以不说了,对不对。
12:08
那如果问,那我得说清楚啊,对不对。说白了,你是大概知道。还是说真的知道?是吧,好,这是第一点。啊,这一点是很多人不说的一点,但是我觉得这一点很重要。啊,第2.promise它是支持什么呢?链式调用的,就是因为它支持链式调用,才可以去解决毁掉地域的问题。关键问题是什么?有的同学只能说能解决回调利益的问题,那面试官马上来一句,你说一下回调利益什么问题?蒙圈不知道。就说白了,你是大概知道,但是你不真的知道,还是这个问题是吧,好,那你得描述清楚啊,描述清楚啊,OK,这个时候描述清楚有可以,你可以用纯文本的形式,纯文字的形式来去告诉他,那个时候那这个东西就有点难度,挺难的,因为你要组织一个特别好的语言,用简短的话说出来是不是。
13:13
再一个就是举例子。能理解吧,啊,那如果我用简短的话,是一个什么意思呢。啊,大家知道我们有可能会啊,去做这回所说的回调的问题,就是函数回调函数什么嵌套调用的时候啊,它其实是不便于阅读,也不便于异常处理的。能听懂不当这句话其实没有太说清楚。你说老师,你为什么不用话说清楚了,因为不举例子很难说,特别难。嗯,而且即使你花了很多语言去说,面试官不一定满意,他不一定因为不满意,原因就是你这个描述他让他听着特别,他也不太清楚,他甚至装作不清楚。
14:02
因为他本身清楚了,他就知道你这个表达到底到不到位。能听到,不好来。是这样一个情况,大家看着啊,回调第一问题会涉及到多个异步操作。能听懂不,而且啊,它是连续串联执行的。什么叫串联执行,比如说我有一步操作一,一步操作二,一步操作三,对吧。能听懂不?而第二个义务任务是以一第一个义务任务的什么结果为条件的?能听懂不,而第三个异步任务了,它是以什么第二个的结果,为什么条件的,那你就得想啊,我一个,因为任务是不是最后要执行函数啊,要指定一个回调函数啊。那回调函数是不是接收成功的结果,当然也会去传失败的回调,是不是失败回调我们暂时不用太管啊,那这个函数调动是不是说明我的第一个是不是有结果了,那我是不是就准备执行什么第二个,那执行第二个是不是传前面那个结果作为条件是否而我是不是同时也指定成功的回调和失败的回调?
15:13
那成功的回调是不是接收到了新的成功的结果,那接着执行什么?是不是第三个。第三个是不是又要传入条件,而这个条件是不是上一个成功的结果,接着要指定新的第三个异步的是不是回调函数来接收,最终的是不是结果。是吧?那大家看着这个时候是不是有回调函数的嵌套。是还是不是,它的这个代码是水平向右发展的,对不对。能听懂不,这种代码特别难以阅读,这是第一点,第二点啊,他的这个异常处理是不是要每个都分别去做。能听到不,每个都分别做,而且处理起来是挺麻烦的啊,如果比如说我这里面有个东西出出了异常,它也是挺费劲的一个事情。
16:09
好好啦,这是说的是,也就是说这个给你描述的是不是纯回调的形式会。可能会出现回调地域的问题。你就回调函数嵌套,你要知道什么时候我会进行回调函数的嵌套。多个串联的一步操作。什么叫串联?就是第一个搞完以后才搞第二个,第二个搞完以后才搞什么,第三个。能听懂吧啊。这种啊不便于阅读,异常处理也比较麻烦。这才称为回购地域。这种情况就称为毁掉,而我们用promise方式怎么写的,大家看好了。一旦用promise,我就会封装一个函数,它是个异步操作,返回的是个什么?这个函数返回的是个promise,你要知道啊,一旦得到了一个promise,说明我启动了一个异步任务。
17:06
对不对,能听懂不?一旦我得到了一个promise对象,那我就启动了一个异步任务,或或者说一个promise对应一个什么异步任务。是这意思吧,好点,认方,这是不是个成功的回调,是不是收到了成功的结果,接着我return return什么呢?是不是返回,我又去调用我的第二个义务任务的处理,返回一个新的promise吧。是这意思吧,呃,这个时候点认收到的结果是谁,哪个结果是不是这个内部的promise最终的结果。那是不是我得到了第二个异步任务返回的成功的结果?接着是不是做第三个类似的,对不对。你看着我的代码是什么?是不是从上往下编写的,从上往下编写就看起来就是一个同步编码方式,是不是能看到不啊,就看起来是不是更加方便一些,这能看懂吧,能这个应该能看懂,我从上往下写对不对。
18:11
啊,是嵌套的关系吗?板上不是,那是不是就没有回调地域的问题?是吧,还有一个大家需要知道编码方式解决,我这个是不是阅读感是不是比他要强,还有一个事情,我处理异常是统一的,来个点什么看一下。什么意思?我中间是不是只需要写成功的回调?我有写失败的回调吗?没有,但是他们中任何一个出了异常,是不是都会找这一个他?都会传到这里来。这个其实有一个概念叫异常啊,异常穿透。Try to。
19:01
就是我不是调用有有多个promise的处理吗?是不是,那无论是任何一个出了问题,是不是都会一直传传传传传传到最下面。错误的回答处理。怎么怎么实,怎么实现这个目标,那就是我们要研究的圆满那个实现,我们自己去实现的时候,那那个时候想的事情,这个是个结果,能听懂吧,他有这个能力,你先知道有这个能力,再就说我们怎么实现它的这个特点。能听懂吧,啊,这个有时候面试的问啊,叫异常团透大概提一下啊,你要不太清楚没关系啊。这了,没弄。陈总啊,这样就能看到我们promise解决回调地域是一个什么样的情况。第一个编码上从上往下写。阅读是不是更加方便?第二个异常处理是不是更加方便?对,但是promise是解决回调率最最优化的选择吗?就是终极的方案吗?
20:03
不是,为什么不是呢?因为它还有回调函数。虽然说没有回弹函嵌套了是吧,但还有回调函数,怎么解决回调函数,怎么干掉回调函数。Ah I think of it。这个用过了吧,用过啊,大家看这个代码。还有回答是纯粹的,从编码上来说是不恐怖的编码方式。而promise还不能为成为纯粹的。啊,同步编码方式,你说老师什么叫同步的编码方式,没有回答函数。能听懂不当这个是从源码上来看,真正而渗位的最后是要编译的。编译后的代码你不用管,编译后面的肯定是有回调函数的,能听懂,不但是从源码,从我们程序员的感受来看。是不是没有了,回家来做?能听懂吧,啊这个时候。
21:02
就可以用,哎作为什么是A以后是不是得到了异步的结果。接着再去执行第二个事情,是不是啊,也就是说我第二个事情是不是必须等到第一个事情成功之后才去处理。但中间是不是有可能出异常?那如果出了错误了,我要怎么处理?叉开来处理。啊,这个代码是没办法直接运行的,是个伪代码。能不能看懂啊,这个就让大家说了来注意啊。我们啊,支持练习作用是解决回调地域的一个关键的一点,它要不支持练习作用是肯定是做不到的,对不对?好,那什么是回调率,刚才说过了啊,回调函数嵌套,呃,还要说清楚一点,第二个义务任务是以第一个义务任务成功为前提,是不是第三个是以第二个为前提,这个要说清楚啊,要能说清楚,回头就要确认,不便于阅读啊,不便于异常处理。
22:02
啊,解决方案是什么?Promise是什么?念词交用,但终极解决方案是谁,Think?那你说之所以说升级,那是不是说这种方式还不是最优的选择,优在哪呀,还有回调函数。虽然说没有了嵌套,但是还有吧,有啊,我们可以做的更好,基本上啊位的是异步操作,异步编码的最后的一个方案了,你要做到比他还好,很难了。而且这一个字,这个单词是非常非常贱名之义的,还记不记得这个前面出过什么generator,什么星号的,可能大家没讲啊,中间出现过一个解决方案的,但那个。太不见明之意,编码起来不太方便,所以说基本上你不用啊。现在是不是总共知道两个点了啊,不要仅仅就说一个,回家句啥话也不能说啊。
23:05
就你就想啊,你再去给他解释为什么用promise,你都跟他可以说个一两分钟,那种感觉是很爽的。能听到不可能,大家可能其他的面试的可能就说一句话,一句话还就几个字,毁掉地域。嗯。你不能仅仅是那样儿。
我来说两句