随手刷题——04.实现一个简单的Promise.all

93 阅读2分钟

定义

Promise.all()是一个用于并行执行多个异步任务的方法,它接收一个Promise对象的数组作为参数,返回一个Promise对象。在多个异步任务完成后,返回的Promise对象才会被resolve,返回值是一个数组,包含每个异步任务的结果。

作用

  1. 并行执行多个异步任务:使用Promise.all()可以同时执行多个异步任务,而不需要编写嵌套的回调函数。多个异步任务会在同一时间开始执行,并且只有当所有的任务都完成后,返回的Promise对象才会被resolve,这样可以有效提高代码的性能和效率。

  2. 处理多个异步任务的结果:使用Promise.all()可以方便地获取多个异步任务的结果,并将它们组合成一个数组返回。这样可以避免编写大量的回调函数,使代码更加简洁和易于维护。

需要注意的是,如果Promise.all()方法的任何一个Promise对象被rejected,则整个方法都会被rejected,这意味着必须处理每个Promise对象的错误情况,以避免程序崩溃。

初步实现

根据上面的概念描述,我们可以知道在promise.all中最终会返回一个resolved或是rejected的promise对象。并且在出现错误之后,会立即中止后续promise的执行。所以代码如下:

Pasted image 20230527004104.png

通过上面的代码,我们实现了一个初始版本的promise.all。但是仍然存在一些问题,例如”传入的不是一个数组“或者”传入的不是一个promise数组“再或者”数组中包含多个重复的promise“。针对这些问题,我们需要对代码再做一些边界处理。

一些边界处理

Pasted image 20230527004810.png

可以看到,我们在代码中增加了对于入参的处理,保证后续进入promise执行的时候不会出现问题。

测试用例

可以使用以下测试用例进行测试

Pasted image 20230527005038.png Pasted image 20230527005103.png

总结

在实现Promise.all()方法时,需要注意以下几点:

  1. Promise.all()方法的参数应该为一个Promise对象数组。如果传递的参数不是Promise对象数组,应该将其转换为Promise对象数组。
  2. 如果Promise对象数组中有一个或多个Promise对象被rejected,Promise.all()方法会立即返回一个rejected状态的Promise对象,并且直接跳转到catch块中处理异常错误。
  3. 如果Promise对象数组中所有的Promise对象都被resolve了,Promise.all()方法会返回一个resolved状态的Promise对象,并提供以Promise对象数组的形式返回每个Promise对象的结果。
  4. Promise.all()方法的结果的顺序应该和Promise对象数组传入的顺序一致。
  5. 如果Promise对象数组为空,则Promise.all()方法应该立即返回一个resolved状态的Promise对象,该Promise对象的结果为一个空数组。