You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:32:00