使用Async/Await调用Google Maps API无法获取返回值的问题排查
解决Google Maps API异步封装的问题
我来帮你梳理下代码里的核心问题,其实都是异步操作的封装和调用逻辑没处理对,咱们一步步修正:
问题分析
1. getAddress函数未正确封装Promise
你标记了它是async函数,但内部用的是Google Maps客户端的回调式API,没有返回任何Promise,所以await getAddress()根本拿不到预期的地址结果,只会得到undefined。
2. showResult函数的逻辑错误
- 调用
getAddress()时没传查询参数,等于白调用; - 它返回的是一个字符串,但你后面把它当函数调用
waitingFunc(),会直接报错; - 其实它不需要是
async函数,因为传入的地址已经是await后的同步值了。
3. handleAddress里的变量错误
你用了formattedAddress这个未定义的变量,应该传入已经await到的awaitedResult;而且对showResult的返回值做了多余的函数调用。
修正后的完整代码
const mapsApiKey = 'API_KEY'; const googleMapsClient = require('@google/maps').createClient({ key: mapsApiKey }); // 1. 把回调式API封装成Promise,这样async/await才能生效 async function getAddress(queryString) { return new Promise((resolve, reject) => { googleMapsClient.geocode({ address: queryString }, function (err, response) { if (!err) { // 加个判断避免结果为空导致报错 if (response.json.results.length > 0) { let formattedAddress = response.json.results[0]['formatted_address']; resolve(formattedAddress); } else { reject(new Error('No address found for the query')); } } else { reject(err); } }); }); } // 2. 简化showResult,直接接收地址参数拼接字符串 function showResult(address) { return "result from Promise: " + address; } // 3. 修正主函数的逻辑顺序和变量引用 async function handleAddress(inputString) { try { // 等待getAddress返回地址结果 let awaitedResult = await getAddress(inputString); // 传入拿到的地址,得到拼接后的字符串 let waitingFunc = showResult(awaitedResult); // 直接打印结果即可 console.log(waitingFunc); } catch(err) { console.error('Error occurred:', err); } } // 调用测试 handleAddress('London');
额外优化建议
可以用Node.js内置的util.promisify来简化Promise封装,不用手动写Promise:
const util = require('util'); // 把回调方法转换成Promise版本 const geocodePromise = util.promisify(googleMapsClient.geocode); async function getAddress(queryString) { const response = await geocodePromise({ address: queryString }); if (response.json.results.length === 0) { throw new Error('No address found'); } return response.json.results[0].formatted_address; }
这样代码会更简洁,也避免手动写Promise的冗余。
内容的提问来源于stack exchange,提问作者Marcatectura
相关产品推荐
相关产品推荐

