我使用Promise.all的方式是否正确?代码无报错但结果不符合预期
问题排查与修复方案
核心错误点
- 错误接收
Promise.all的执行结果
你当前将charity同步赋值为map返回的Promise数组,Promise.all(...)执行完成后的返回值才是所有异步请求的结果集合,你没有接收这个返回值,直接返回了最初的未处理Promise数组,自然拿不到预期数据。 - 响应处理逻辑位置错误
你注释掉的经纬度解析代码写在了同步流程中,此时urlResponse还处于Promise状态,未拿到接口返回的实体数据,就算取消注释也会直接报错。 - 接口参数拼接错误
谷歌地理编码接口的address参数不需要额外包裹单引号,多余的引号会导致地址匹配失败,返回空结果。
修复后代码示例
const charityPromises = charityData.map(async (data) => { const address = data.zipCode; // 移除address周围多余的单引号 const url = `https://maps.googleapis.com/maps/api/geocode/json?&address=${address}&key=***Google geocoding Key***`; // 等待异步请求返回实际响应数据 const urlResponse = await Backendless.Request.get(url); // 解析响应拿到经纬度 const latitude = urlResponse.results[0].geometry.location.lat; const longitude = urlResponse.results[0].geometry.location.lng; // 返回处理后的目标结构数据 return { objectId: data.objectId, latitude: latitude, longitude: longitude }; }); // 等待所有请求完成,接收处理后的最终数据集合 const charity = await Promise.all(charityPromises); return charity;
补充排查项
- 单个请求失败会导致
Promise.all直接抛出异常,你没有加错误捕获逻辑可能导致静默失败,可以给每个异步任务加try/catch处理:
const charityPromises = charityData.map(async (data) => { try { // 上述请求和数据处理逻辑 } catch (err) { console.error(`处理ID为${data.objectId}的数据失败:`, err); // 可返回错误标识,避免整个批次的请求都被终止 return { objectId: data.objectId, error: err.message }; } });
- 确认你使用的谷歌地理编码密钥有对应接口的调用权限,没有触发配额限制,也不存在跨域拦截问题。
内容的提问来源于stack exchange,提问作者shahrukh khan
相关产品推荐
相关产品推荐

