【问题标题】:Trying to call object in array, returns undefined试图调用数组中的对象,返回未定义
【发布时间】:2017-03-13 13:51:36
【问题描述】:

我试图调用数组中唯一的对象,但这总是返回未定义的。如果我记录整个数组,我可以看到其中的所有内容,如果我调用它的对象,它返回未定义!

代码:

var pos = [];

this code is inside a function____

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) { 
        pos.latlng = {
          lat: position.coords.latitude,
          lng: position.coords.longitude
        };  
        console.log(position.coords.latitude);

    });
}

 console.log(pos.latlng);  <--- undefined
 console.log(pos);         <--- works fine
 console.log(pos[0].latlng); <--- also tried this

console.log(pos) 的结果;

Object
latlng : Object
   lat : 52.136624499999996
   lng : 5.3469106
   __proto__:Object
__proto__:Object

【问题讨论】:

  • 关于尝试访问外部 Asynchroons 函数 内的值集的老问题!
  • 加上pos 是一个数组而不是一个对象。你使用它的方式应该声明为:var pos = {}.
  • 我也试过这个!也返回未定义。
  • 请添加console.log(pos); &lt;--- works fine的结果。
  • 编辑了帖子,就在里面

标签: javascript arrays object


【解决方案1】:

我建议将新对象推送到pos

pos.push({
    lat: position.coords.latitude,
    lng: position.coords.longitude
});

然后访问

pos[0].lat

【讨论】:

  • 忘了说!但我也试过这个,这会返回:无法读取未定义的属性'lat'
  • 为什么不能创建像 pos.latlng = { lat: position.coords.latitude, lng: position.coords.longitude } 这样的键值对; ?
  • 您应该提到,所有依赖于异步函数的代码都应在该函数内部或该函数完成后使用!
  • 它在 initmap() 函数中,如果有帮助的话
【解决方案2】:

实际上,数组是一个对象,除了它的属性是介于 0 和 2³² - 2 之间的数字和长度属性,所以是的,你可以这样做:

 var pos = [];
    pos.inneObject= {//object
      prop: 'property'
    };

pos.innerObject 将存在。但是如果你尝试console.log(pos) 你会得到 '[]' 但如果你这样做

for (properties in pos){
console.log(pos[properties])// you will get pos.innerObject
}

因此,您的问题是另一回事!在这里,您在创建属性之前记录属性,将您的 console.log 移动到 navigator.geolocation.getCurrentPosition 的回调中,如下所示:

var pos = [];

this code is inside a function____

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) { 
        pos.latlng = {
          lat: position.coords.latitude,
          lng: position.coords.longitude
        };  
        console.log(position.coords.latitude);

 console.log(pos.latlng);  <--- undefined
 console.log(pos);         <--- works fine
 console.log(pos[0].latlng); <--- also tried this

    });
}

应该可以的;

【讨论】:

  • 是的!他们确实在这个回调中工作,我怎样才能做到,所以我也可以在其他地方调用它?我猜是某种延迟或稍后再打电话?
  • 可以在回调结束时触发事件,并监听回调执行后续动作
  • 嗯,因为稍后在函数中我用这个对象作为参数调用另一个函数。这是在我为地图创建标记之后,然后我将标记和 pos 对象都调用到一个函数来计算距离。
  • 是的,我明白了,但问题是 getCurrentPosition 是异步函数,里面的回调是 getCurrentPosition 返回后立即执行的。在您的示例中,您的 console.log 在回调之外,因此在 getCurrentPosition 返回之前执行。因此,每个应该使用位置数据的函数都应该等待该函数返回。您无法真正评估它将花费的时间,因此您有 2 个解决方案: 在回调中调用后续函数。或者在回调中触发一个事件,显示“我们收到了位置数据”.. 你明白我的意思吗?
  • 是的,我明白了,所以 console.log 在 getcurrentposition 之前触发。因为 getcurrentposition 仍在运行时一切都在继续?在 getcurrentposition 完成后,是否可以继续其余的工作?非常感谢您的帮助,
【解决方案3】:

这里的问题是 getCurrentPosition 是异步的。您作为参数提供的函数,也称为回调,在获取当前位置之前不会被调用。

我不知道你在这里使用什么来获取当前位置,但你需要确保在调用回调之前不要使用结果。

【讨论】:

    【解决方案4】:

    这是因为您首先将 pos 定义为数组,然后将其视为匿名对象。将其作为数组或匿名对象。

    如果你想拥有 latlan 属性,那么在代码开头定义 pos 如下:

    pos = {};
    

    否则,您不能拥有数组的属性。因此,您需要将其删除并将 0 索引作为 lon,将第 1 个索引作为纬度:

    pos = [];
    pos.push(position.coords.longitude); // pos[0];
    pos.push(position.coords.latitude); // pos[1];
    

    【讨论】:

      【解决方案5】:

      根据@ibrahim-mahrir 所说的。

      你可以承诺重新热爱你的职位:

      var pos = {};
      
      this code is inside a function____
      
          getPos(){
      
            return new Promise(function(resolve){
              if (navigator.geolocation) {
              navigator.geolocation.getCurrentPosition(function(position) { 
                   resolve({
                    lat: position.coords.latitude,
                    lng: position.coords.longitude
                  });  
              });
            });
          }
      
      getPos().then(function(pos){
      
        console.log(pos.lat);
        console.log(pos.lng);
      })
      

      【讨论】:

        【解决方案6】:

        pos 应该是一个对象(但这不是错误的来源)。

        这个错误可能是因为函数getCurrentPosition的异步导致的。如果它是异步工​​作的,那么日志记录将在值被分配给pos 之前发生。您应该在 getCurrentPosition 的回调中进行日志记录,或者将日志记录包装在一个函数中并从回调中调用它。

        var pos = {}; // object
        
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function(position) { 
                pos.latlng = {
                    lat: position.coords.latitude,
                    lng: position.coords.longitude
                };
        
        
                // SOLUTION ONE: use pos here
                console.log(pos);
                console.log(pos.lating);
        
                // SOLUTION TWO: call a function that do the logging
                logPos();
            });
        }
        
        function logPos() {  // will be called after the value is assigned
            console.log(pos);
            console.log(pos.lating);
        }
        

        【讨论】:

          猜你喜欢
          • 2021-05-20
          • 1970-01-01
          • 1970-01-01
          • 2019-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-23
          相关资源
          最近更新 更多