故事背景:
在JavaScript中,经常会遇到需要同时执行多个异步操作的情况。而Promise.all方法提供了一种便捷的方式来处理这种情况,可以同时处理多个Promise对象,并等待它们全部完成后再执行后续操作。
Promise.all接受一个Promise对象数组作为参数,并返回一个新的Promise对象。这个新的Promise对象将在所有的输入Promise对象都变为resolved状态后变为resolved,或者在任何一个输入Promise对象变为rejected状态后变为rejected。
实例:
比如下边这个方法中,我需要循环多次请求数据,最终把数据放到endTreeData中,但是实际我这样写在 console.log(endTreeData) 的时候你可能会看到 endTreeData 是等于🈳️或者是不全的。
因为在代码中,console.log(endTreeData)
语句位于循环之后,但是这些代码会在循环结束后立即执行,而不会等待异步请求的结果返回。
这时就要对代码进行改造了:
initRoleTreeOfManagements() {const manageUnitUUIDs = ['1', '2', '3', '4'];const manageUnitNames = ['一厂', '二厂', '三厂', '四厂'];const endTreeData = [];manageUnitUUIDs.map((manageUnitUUID, index) => {return pbService('service.Service', 'queryListByAttr', {query_fields: {sysisdelete: '0',manage_unit_uuid: manageUnitUUID,},result_fields: 'uuid,name,uuid',order_fields: '',}).then(res => {if (res && res.resultset) {res.resultset.push({role_name: manageUnitNames[index],app_uuid: this.$TREE_ROOT,});endTreeData.push(...res.resultset);}})});console.log(endTreeData)this.roleTreeData = loopTreeData(endTreeData, this.$TREE_ROOT, {idFiled: 'uuid',nameField: 'name',parentField: 'uuid',});},
改造后法示例:
initRoleTreeOfManagements() {const manageUnitUUIDs = ['1', '2', '3', '4'];const manageUnitNames = ['一厂', '二厂', '三厂', '四厂'];const endTreeData = [];const promises = manageUnitUUIDs.map((manageUnitUUID, index) => {return pbService('service.Service', 'queryListByAttr', {query_fields: {sysisdelete: '0',manage_unit_uuid: manageUnitUUID,},result_fields: 'uuid,name,uuid',order_fields: '',}).then(res => {if (res && res.resultset) {res.resultset.push({role_name: manageUnitNames[index],app_uuid: this.$TREE_ROOT,});endTreeData.push(...res.resultset);}})});console.log(endTreeData)Promise.all(promises).then(() => {this.roleTreeData = loopTreeData(endTreeData, this.$TREE_ROOT, {idFiled: 'uuid',nameField: 'name',parentField: 'uuid',});},
在上面的示例中,我增加了请求返回Promise对象。使用Promise.all将这三个Promise对象组合在一起,并在所有的Promise对象都变为resolved状态后获取它们的结果。
值得注意的是,Promise.all返回的Promise对象本身不会等待所有的异步操作完成,而是在所有的Promise对象都变为resolved状态或者有一个Promise对象变为rejected状态后立即返回。
因此,如果其中一个异步操作较慢或者失败了,整个Promise.all的结果都将失败。
总结
使用Promise.all可以方便地处理多个异步操作,并在它们全部完成后执行后续操作。