00:00
Hello,大家好,那这一个小节呢,我们来介绍一下啊,Promise当中另外一个方法的封装,那就是这个or方法。这个二方法呢,咱们之前在介绍API的时候呢讲过,它呢返回的结果是一个promise对象参数呢一般是一个promise组成的数组。它的结果呢?由promise这个数组当中的每一个元素它们的状态来决定。如果他们三个啊,或者他们几个都成功,则这个返回的结果就是一个成功的状态。而且呢,它的成功结果是这几个promise对象他们成功结果组成的一个数组。那如果说这个promise对象有一个失败了啊,在这个数组里边啊,有一个失败了,那这个返回的结果就一定是一个失败的promise对象,且他失败的结果就是数组当中啊失败的那个promise它的一个结果。
01:00
好了,那么首先的话,咱们先来看一看啊,这是一个成功的情况,点开浏览器。刷新。好了,大家可以看一下,点开状态为成功,成功的结果为这三个promise对象他们成功结果组成的一个数组,而且他们的顺序注意。啊,你看P1P2P3 OK success oh yeah OK success,欧耶啊,没有问题啊,这个顺序是要对应的,好,那下边的话,我们点开自己的这个promise,咱看一看。好了,首先先报一个错,说兄弟啊,这块呢,并不是一个函数,那好我们去添加一下,这个时候添加二方法。Project or等于一个function?好了,他呢,接收一个参数,这个参数是一个promise的数组,然后呢,返回的结果。为一个promise的对象,所以呢,咱们这直接new一个promise。
02:06
好了,那返回之后在这里边儿呢,去对它的状态呢,去做一个修改。如果是这样的一个单纯啊这样去写的话,它的结果一定是一个pending状态的promise,大家可以看一下,为什么呢?因为你在这个代码里边并没有去做任何resolve和reject函数调用啊,所以说你是一个pending状态的,那好接下来呢,我们就开始对状态去做一个设置,我们说了啊,这个状态是由这里边儿的promise对象它的状态来决定。他们如果都成功。他才能成功,那好,我们来思考一下,如何才能判定出他们三个都成功呢?好,那其实在这呢,我们要做的事情就是我们要挨个的去对他们做一个检测,因为是数组啊,所以咱们呢,应该先做一个遍历。然后来一个for循环,Let I等于零,I呢小于一个promises,然后呢,Length I加加。
03:06
好,那在这的话呢,Promises下标I,这就是其中的一个promise对象。啊,这就是其中的一个promise对象,那既然它是一个成功的,既然它是一个对象,所以他一定能够去调用这个Z方法。啊,它既然是一个promise对象,它一定是能够去调用这个Z方法的,而且它如果成功就会调第一个回调函数。注意,这是个重点,它如果成功就会调用第一个回调函数里边的代码,所以说他只要执行这个代码就表明成功了,所以说在这个地方我们可以得知。得知这个对象的状态。是。成功的。啊,状态成功的好了,那对象如果成功的话,我们这里能直接去调这个resolve函数吗。
04:07
大家可以想一想。我们在这个位置能直接去写resolve吗?哎,你看啊,我们当前这个成功了,成功的话,我执行第一个回调,执行第一个回调我就去调resolve,把整个对象状态变为一个成功。这样子做明显是不行的,为什么呢?因为很可能你第一个对象他成功了,走里边这个代码。第二个呢,很可能失败了,他如果失败的话,你想一想。正常来说,返回的结果应该就应该是失败的,二方法它的一个规则啊,你如果有一个失败,就应该返回失败,但是你第一次循环,因为P是成功的,你直接掉了resolve,就将返回结果的promise对象变为一个成功了。那所以说你后续再去调reject的时候,就已经改变不了状态了,所以直接在这里去调resolve改变状态是不合适的,那么什么时候去调resolve才合适呢?就是三个。
05:08
啊,对象或者说N个。我说每一个。美。每个家都成功。才能去执行这个resolve函数,我们可以得知一个,但是三个怎么得知呢?哎,在这儿的话,我们可以呢,加一个这样的循环,加一个这样的技术变量。哎。声明变量啊,Let count'。等于一个零。啊,你你每成功一个,你肯定要执行这个回调,我们就让它呢加一。啊,就让他加一。每来每成功一个,这加一每成一个,每成功一个再加一,好,那么他加了,加完之后就是每比方说都成功了啊,都成功之后。这个数字也就到达最高值了。
06:00
我们这个时候可以做一个判断,如果说count这个值要是等于了promises.length。你想啊,如果count要是等于了promises l就是三,那就表明。三个。这个promise对象的状态就都已经成功了。再说一遍啊,大家可以啊,这里是个重点啊,就只有你这个数字,它加到了跟整体数组的这个元素个数相同的数。啊,跟它相同的时候,那这个时候才表明这三个或者这N个promise对象他们都成功了。那都成功之后,咱就可以调resolve函数去修改状态了。啊,这样子可以了,那除了改变状态之外,还有咱们还有另外一个事情需要去做什么事情呢?就是得有一个结果。
07:01
成功的结果。那么成功结果是什么呢?成功结果是这几个promise对象他们成功结果组成的一个数组。所以说呢,这需要一个数字,咱们先来声明一下。A等于一个数组,这是存放成功结果那个数组,然后当他成功之后,比方说它掉啊,第一个,第二个,第三个都一样在这,他如果成功了,他一定会走这。运行这个函数里边代码,我们需要的是将当前promise对象成功的结果。存入到数组中。那如何将一个值存到数组当中呢?咱们可以使用ar.push的方式去做一个保存,这是一种方式,但是这种方式啊,存在。一点点小瑕疵,瑕疵在哪儿?瑕疵就在于这个结果的顺序很可能与数组它的一个顺序是不相不相同的。
08:01
啊,因为他们的职就是先后改变状态的这个。这个时间呢,它不一定,很可能后边这个先改变状态,它就先进到数组里边了,那它的这个下标就不再是中间这个一了,可能是一个零。所以说我们这用它不合适,应该换谁啊,咱们可以这样子AR,然后I。I就是元素在数组当中的下标,所以在存储结果时,我们也使用I来对这个数据做一个保存为。最终再把这个AR放到resolve当中,设定一个成功就可以了。然后呢,失败的话就是你失败,那整体的返回结果也失败。好,我们可以来看一看这个结果了。点开它右键刷新。你看三个成功这块就是成功,然后呢,你看,而且还有顺序啊,他看这OK success欧耶没有问题啊,而且你在你在这里,即便说他是一个异步任务,它后改变状态。
09:08
它的位置也是不受影响的,当然咱们说的是结果的位置也是保持这个顺序的。好,点开右键刷新它,先是pending,因为那个呢,还没有第一个还没有改变状态,然后点开它,你看fulfilled OK success和欧耶就出来了,那如果说有一个失败了,比方说咱第二个这个失败了。啊,改这儿啊。他如果失败的话呢,那整体结果就失败,右键刷新是吧,你看这。就失败了,失败就是你看你这儿只要一失败,这在另一方法掉的时候呢,就直接走这儿了。一走,这REJECT1掉,整体结果就立刻变为变为这个失败的promise了。OK,到这儿的话,关于or方法的封装我们就已经完成了,把它先保存一下。
我来说两句