定义
Promise.all()是一个用于并行执行多个异步任务的方法,它接收一个Promise对象的数组作为参数,返回一个Promise对象。在多个异步任务完成后,返回的Promise对象才会被resolve,返回值是一个数组,包含每个异步任务的结果。
作用
-
并行执行多个异步任务:使用
Promise.all()可以同时执行多个异步任务,而不需要编写嵌套的回调函数。多个异步任务会在同一时间开始执行,并且只有当所有的任务都完成后,返回的Promise对象才会被resolve,这样可以有效提高代码的性能和效率。 -
处理多个异步任务的结果:使用
Promise.all()可以方便地获取多个异步任务的结果,并将它们组合成一个数组返回。这样可以避免编写大量的回调函数,使代码更加简洁和易于维护。
需要注意的是,如果Promise.all()方法的任何一个Promise对象被rejected,则整个方法都会被rejected,这意味着必须处理每个Promise对象的错误情况,以避免程序崩溃。
初步实现
根据上面的概念描述,我们可以知道在promise.all中最终会返回一个resolved或是rejected的promise对象。并且在出现错误之后,会立即中止后续promise的执行。所以代码如下:
通过上面的代码,我们实现了一个初始版本的promise.all。但是仍然存在一些问题,例如”传入的不是一个数组“或者”传入的不是一个promise数组“再或者”数组中包含多个重复的promise“。针对这些问题,我们需要对代码再做一些边界处理。
一些边界处理
可以看到,我们在代码中增加了对于入参的处理,保证后续进入promise执行的时候不会出现问题。
测试用例
可以使用以下测试用例进行测试
总结
在实现Promise.all()方法时,需要注意以下几点:
Promise.all()方法的参数应该为一个Promise对象数组。如果传递的参数不是Promise对象数组,应该将其转换为Promise对象数组。- 如果Promise对象数组中有一个或多个Promise对象被rejected,
Promise.all()方法会立即返回一个rejected状态的Promise对象,并且直接跳转到catch块中处理异常错误。 - 如果Promise对象数组中所有的Promise对象都被resolve了,
Promise.all()方法会返回一个resolved状态的Promise对象,并提供以Promise对象数组的形式返回每个Promise对象的结果。 Promise.all()方法的结果的顺序应该和Promise对象数组传入的顺序一致。- 如果Promise对象数组为空,则
Promise.all()方法应该立即返回一个resolved状态的Promise对象,该Promise对象的结果为一个空数组。