当设置变量时(等待设置然后执行)

时间:2017-08-18 10:41:41

标签: javascript

我想在设置变量后立即执行函数(geoloaction['latitude'])。我不确定以下代码是否是使用延迟的正确方法。不幸的是,它并没有像我希望的那样工作。

$.when( geolocation['latitude'] ).then( function(){
            console.log( 'latitude = ' + geolocation['latitude'] );
        });

等待变量设置然后执行函数的最佳/正确方法是什么?

2 个答案:

答案 0 :(得分:0)

错误使用时间:

var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();

$.when( d1, d2, d3 ).done(function ( v1, v2, v3 ) {
    console.log( v1 ); // v1 is undefined
    console.log( v2 ); // v2 is "abc"
    console.log( v3 ); // v3 is an array [ 1, 2, 3, 4, 5 ]
});

d1.resolve();
d2.resolve( "abc" );
d3.resolve( 1, 2, 3, 4, 5 );

如果您无法在代码上调用函数,则可以使用以下命令检查值:

setInterval(function(){ 
  if(geolocation['latitude'] != undefined){
      console.log( 'latitude = ' + geolocation['latitude'] );
  }
}, 1);

答案 1 :(得分:0)

我不想使用时间间隔循环,因为我认为必须有更现代的方法来解决这个问题。所以我在stackoverflow上发现了另一个有趣的解决方案,它允许我将事件监听器附加到变量并在设置变量后执行我的代码。

https://stackoverflow.com/a/37403125/4688612

我的解决方案现在看起来像这样:

在我的地理定位脚本中,我使用事件监听器安装变量(纬度和经度)。

geolocation = {
    latlonInternal: '',
    latlonListener: function(val) {},
    set latlon(val) {
        this.latlonInternal = val;
        this.latlonListener(val);
    },
    get latlon() {
        return this.latlonInternal;
    },
    registerListener: function(listener) {
        this.latlonListener = listener;
    }
}    

在我的Google地方信息自动填充API中,我注册了侦听器并等待设置变量。

geolocation.registerListener( function(val){
            console.log( 'latitude = '  + val[0]);
            console.log( 'longitude = ' + val[1]);
        });

地理定位服务检索到位置后,它将更新地理位置变量并触发侦听器。

geolocation.lonlat = [ geoipResponse.location.latitude, geoipResponse.location.longitude ];

这样,我的GeoIP代码和Google Paces Autocomplete API完全分离,不需要嵌套。