【问题标题】:Meteor method after api call returning undefinedapi调用返回未定义后的流星方法
【发布时间】:2018-02-17 13:47:46
【问题描述】:

我正在使用 Meteor,每当我对谷歌地理编码进行 api 调用并尝试从中返回值时,我得到一个未定义的值,我正在使用 api 的回调,所以那里肯定有数据,所以我不确定是什么原因造成的

callWeather = e => {
  e.preventDefault();
  console.log(this.state.address);
  Meteor.call("geCoordinates", this.state.address, function(err, result) {
    if (err) {
      console.log(err);
    } else {
      console.log(result);
    }
  });
};

geCoordinates(address) {
  googleMapsClient.geocode({ address }, (error, data) => {
    if (error) {
      console.log(error);
    } else {
      console.log(data.json.results[0].geometry.location.lat);
      return data.json.results[0].geometry.location.lat;
    }
  });
},

【问题讨论】:

  • 为什么需要在你的服务器方法上调用googleMapsClient,然后将结果返回给客户端?为什么不直接从客户端调用呢?
  • 每当我尝试从客户端调用时,它都会抛出一个错误,提示内容类型未定义并且 access-control-allow-origin 标头无效
  • 好的,这是非常特殊的地图。也许您将您在客户端上尝试过的内容和出现的错误添加到您的帖子中,并用 googlemaps-api 或类似的东西标记您的帖子,这样一些 google maps api 专家找到您的帖子的机会就更高。我认为客户端调用是正确的,您应该专注于解决客户端上的错误而不是切换到服务器。

标签: javascript meteor geocoding


【解决方案1】:

这是大多数人在开始时常犯的错误。这里的问题是,在您的方法代码执行回调函数之前,客户端中存在数据响应。这个有很多解决方案:

  1. https://stackoverflow.com/a/20090566/6880789

但是,我建议您使用Meteor.wrapAsync,如下所示:

let getGeoCode = Meteor.wrapAsync(googleMapsClient.geocode, googleMapsClient.geocode),
data = getGeoCode({ address });  // data contains data of your callback

【讨论】:

  • 除了这是一个有效的答案,我建议使用客户端来解决这个问题以节省服务器资源(假设有 10000 个客户端使用服务器请求谷歌地图 api,然后处理数据,然后发回给客户)。
  • @Jankapunkt 是的,我同意这个问题的解决方案可以通过你的方法来解决,并且这样做有好处。我只是针对任何其他异步进程中可能遇到的问题给出了一个解决方案。
  • 您好,感谢您的回答,我之前尝试过使用 wrapAsync 但实现错误,我将尝试使用@Jankapunkt 从客户端调用的想法,我认为从服务器调用是正确的做事方式,但您绝对正确,感谢您的帮助,但是您告诉我从服务器调用的方式也很有效
猜你喜欢
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多