【问题标题】:Javascript: return nested function(asynchronus)Javascript:返回嵌套函数(异步)
【发布时间】:2014-06-23 16:44:57
【问题描述】:

我想通过调用 get.Location 从函数 getDistanceFromLatLonInKm 的返回中访问(或打印)d。我想我可能会使用回调,但它不起作用(和/或我是一个 n00b)。这可能吗在这种情况下这样做?例如:document.write(getLocation(45.123,12.123)) //would print d somehow .

提前谢谢你。

getLocation(45.123,12.123);

function getLocation(a,b) {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(p){ajmo(p,a,b);});
  }
}

function ajmo(position,a,b) {
  lat = position.coords.latitude;
  lng = position.coords.longitude;
  getDistanceFromLatLonInKm(a,b,lat, lng);
}


function getDistanceFromLatLonInKm(lat_origin, lon_origin, lat_pos, lon_pos) {
  var R = 6371;
  var dLat = deg2rad(lat_pos - lat_origin);
  var dLon = deg2rad(lon_pos - lon_origin);
  var a = 
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(deg2rad(lat_origin)) * Math.cos(deg2rad(lat_pos)) * 
    Math.sin(dLon / 2) * Math.sin(dLon / 2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}     

【问题讨论】:

  • CPS 中工作时,您不会从异步代码中返回值,您需要回调或承诺。
  • 是的,return 在这里很重要,前两个函数中缺少它。
  • @elclanrs 知道如何实现它吗?(回调)。
  • Javascript: access return of the nested function 的可能重复项——请不要重复提问(或thrice)。

标签: javascript jquery function nested


【解决方案1】:

假设你有一个 id = "distance" 的 HTML 元素,你可能需要这个:

function getLocation(a, b, element) {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {
      lat = position.coords.latitude;
      lng = position.coords.longitude;
      var d = getDistanceFromLatLonInKm(a,b,lat, lng);
      document.getElementById(element).innerHTML = d;
    });
  }
}


function getDistanceFromLatLonInKm(lat_origin, lon_origin, lat_pos, lon_pos) {
  var R = 6371;
  var dLat = deg2rad(lat_pos - lat_origin);
  var dLon = deg2rad(lon_pos - lon_origin);
  var a = 
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(deg2rad(lat_origin)) * Math.cos(deg2rad(lat_pos)) * 
    Math.sin(dLon / 2) * Math.sin(dLon / 2)
    ; 
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d;
}

function deg2rad(deg) {
  return deg * (Math.PI/180)
}  


getLocation(45.123, 12.123, 'distance');

【讨论】:

  • 由于navigator.geolocation.getCurrentPosition是异步的,getLocation函数不能从异步操作返回任何结果。
  • 那么,用 document.write(getLocation(a,b)); 写 'd' 是不可能的?
  • 如果你想将'd'设置为结果值,那么你应该在getDistanceFromLatLonInKm函数之外声明它。但是,由于d 将被异步分配,因此最好考虑一下您想用该值做什么,而不是仅仅获取该值。如果你想打印它,那么上面的代码就足够了。如果你想访问它,在它被赋值后调用你想要的函数。
  • 我只想通过调用 getLocation 在 html 中打印它(d)。
  • 您实际上是这样做的 :) 只需将 console.log 替换为用于将 HTML 设置为元素的代码即可。如果需要,您甚至可以将元素 id 或类传递给 getLocation 并设置特定元素的 HTML。使用异步编程时,您必须迅速摆脱让函数返回值的概念。