Javascript / jQuery对象范围问题

时间:2013-04-09 14:16:51

标签: javascript jquery ajax object scope

我在JS中遇到了一些问题,我刚刚接受了。

我已经定义了一个对象,并在其中进行.getJSON()调用,但我似乎无法正确引用调用对象的属性:

// Vehicle object
function vehicle(id) {
    this.id = id;
    var that = this;
    // Fetch some JSON
    $.getJSON("json.php?act=vehicleInfo&id=" + this.id, function (json) {
        that.vehicleInfo = json
        that.icon = L.AwesomeMarkers.icon({ icon: that.vehicleInfo.icon, color: that.vehicleInfo.colour });
        that.polyline = new L.Polyline([[that.vehicleInfo.latitude, that.vehicleInfo.longitude]]);
        that.marker = L.marker([that.vehicleInfo.latitude, that.vehicleInfo.longitude], {icon: that.icon});
        that.marker.bindPopup("Test point");
        that.marker.addTo(map);
        that.polyline.addTo(map);
    });
}

// Vehicle move method
vehicle.prototype.move = function(latlng){
    this.marker.setLatLng(latlng);
    this.polyline.addLatLng(latlng);
}

当我调用.move()时,this.marker未定义。我在哪里错了?

1 个答案:

答案 0 :(得分:6)

不幸的是,Ajax并不是这样的。您无法在任何特定时间甚至根本不依赖$.getJSON回调。一种可能性是使请求同步,但这是不推荐,因为它会锁定浏览器。

唯一可行的解​​决方案是:

  1. 不依赖于ajax
  2. 使取决于ajax回调结果的任何内容取决于回调本身。
  3. 这是因为.move调用而必须为车辆调用$.getJSON的任何代码。不过,你可以让它看起来更优雅:

    this.jqxhr = $.getJSON(...
    /* snip */
    vehicle.prototype.move = function (latlng) {
        var veh = this;
        this.jqxhr.done(function () {
           veh.marker.setLatLng(latlng);
           veh.polyline.setLatLng(latlng);
        });
    }