JavaScript如何获取数组元素回调执行结果并执行后续处理逻辑
解决方案
1. 改造回调式API为Promise返回
首先将原来基于回调的callApi封装为返回Promise的函数,这是脱离回调嵌套的核心步骤:
const callApi = (param1, param2) => { return new Promise((resolve) => { api.doSomething(param1, param2, (result) => { // 回调触发时将结果抛出给Promise resolve(result) }) }) }
封装后callApi调用后会返回Promise实例,天然支持then链式调用与await语法。
2. 批量处理数组并聚合结果
并发处理(性能最优,无并发限制时推荐)
使用map遍历数组生成Promise数组,配合Promise.all等待所有请求完成后,统一执行排序、筛选逻辑:
then链式写法
// 遍历数组生成Promise数组,可在单个请求的then中做单条数据预处理 const promiseArr = myArrayOfObjects.map(myObject => { return callApi(myObject.field1, myObject.field2) .then(apiResult => { // 单条数据的预处理逻辑写在这里,无需嵌套在原始回调中 return { ...myObject, apiResult } }) }) // 等待所有请求完成后处理全量结果 Promise.all(promiseArr).then(allProcessedItems => { // 直接执行排序、筛选等同步逻辑 const filteredList = allProcessedItems.filter(item => item.apiResult.isValid) const sortedList = filteredList.sort((a, b) => a.apiResult.sortId - b.apiResult.sortId) // 后续业务逻辑 })
async/await写法(可读性更高)
async function processObjectArray(arr) { // 并发请求+单条预处理 const allProcessedItems = await Promise.all( arr.map(async myObject => { const apiResult = await callApi(myObject.field1, myObject.field2) return { ...myObject, apiResult } }) ) // 全量数据排序、筛选 const filteredList = allProcessedItems.filter(/* 筛选规则 */) const sortedList = filteredList.sort(/* 排序规则 */) return sortedList } // 调用函数获取最终结果 processObjectArray(myArrayOfObjects).then(finalResult => { // 处理最终结果 })
串行逐个处理(有并发限制时使用)
如果接口对并发数有限制,可改用串行调用的方式逐个处理数组元素:
async function processObjectArraySerial(arr) { const allProcessedItems = [] for (const myObject of arr) { const apiResult = await callApi(myObject.field1, myObject.field2) allProcessedItems.push({ ...myObject, apiResult }) } // 全量数据排序、筛选 const filteredList = allProcessedItems.filter(/* 筛选规则 */) const sortedList = filteredList.sort(/* 排序规则 */) return sortedList }
所有逻辑都完全脱离原始API的回调函数,可按业务需求拆分为独立的预处理、筛选、排序方法,维护性大幅提升。
内容的提问来源于stack exchange,提问作者D. Joe
相关产品推荐
相关产品推荐

