3

网络上大多数简单的 html5 地理定位示例都类似于:

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(success, error);
} else {
    //no geolocation
}

function success(position) {
    //do things with the position object in here
}

function error (msg) {
    //log error codes etc here
}

我不希望在成功回调中包含我所有的逻辑(有很多)。将传递给success父范围的对象公开的最佳方式是什么?通过以success某种方式使用闭包?我不太明白。谢谢

4

1 回答 1

3

需要回调函数的原因是对 getCurrentPosition 的调用是异步的。因此,虽然您可以将位置公开为“父级”(调用 getCurrentPosition 的范围)范围内的变量,但这在调用 getCurrentPosition 的执行线程上没有用,因为这与成功的不同功能。例如,这不起作用:

function parent(){
  var position;

  function success(p) {
    position = p;
  }

  function error (msg) {
    //log error codes etc here
  }

  navigator.geolocation.getCurrentPosition(success, error);
  var longitude = position.coords.longitude; // position is undefined here
}

但是,如果您想将代码分解成更小的块,您可以将位置存储在父级范围内的变量中(避免需要传递它),然后将多个函数链接在一起:

function parent(){
  var position;

  function success(p) {
    position = p;
    doSomethingWithPosition();
  }

  function error (msg) {
    //log error codes etc here
  }

  navigator.geolocation.getCurrentPosition(success, error);

  function doSomethingWithPosition(){
     var longitude = position.coords.longitude; // position is defined here
     doSomethingElseWithPosition();
  }

  function doSomethingElseWithPosition(){
     var latitude = position.coords.latitude; // position is defined here
  }

}
于 2013-10-25T14:59:44.433 回答