Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript/jQuery对象范围问题_Javascript_Jquery_Ajax_Object_Scope - Fatal编程技术网

Javascript/jQuery对象范围问题

Javascript/jQuery对象范围问题,javascript,jquery,ajax,object,scope,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 (jso

我在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时,此.marker未定义。我哪里出了问题?

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

唯一可行的两种解决方案是:

不要依赖ajax 使任何依赖于ajax回调结果的内容都依赖于回调本身。 这是调用.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);
    });
}

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

唯一可行的两种解决方案是:

不要依赖ajax 使任何依赖于ajax回调结果的内容都依赖于回调本身。 这是调用.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);
    });
}

能否显示调用.move的代码?$.getJSON调用会立即返回,但在浏览器收到HTTP响应之前不会调用回调。这是异步发生的。如果你在那之前打电话给move,那么现在还不会发生:-是的。。。就这样。谢谢虽然我注意到,即使我在几秒钟后调用.move,也会出现不呈现多段线的问题-我想它们是特定于传单的,所以我将进行调查…您能将代码显示在调用.move的位置吗?$.getJSON调用会立即返回,但在浏览器收到HTTP响应之前,不会调用回调。这是异步发生的。如果你在那之前打电话给move,那么现在还不会发生:-是的。。。就这样。谢谢虽然我注意到,即使我在几秒钟后调用.move,也会出现不渲染多段线的问题-我想它们是特定于传单的,所以我会调查…哇,Stackoverflow用户太棒了。我还是有点困惑。。。但是我的JSON请求是获取车辆的初始参数-move函数还没有完成,应该做一些类似于完成时所描述的事情!:-@Terry需要了解的重要一点是,$.getJSON的回调函数第三个参数在调用.move之前可能不会运行。事实上,这是极不可能的。不仅如此,它可能永远不会运行!如果你真的需要异步加载初始值,你可以设置一个加载弹出窗口或其他什么,并阻止任何其他调用,直到这是doneThanks的家伙-我理解异步方法的含义-我想。我已经放弃了.move方法,因为我只是用它来测试。实际上,我将使用一个.update方法,该方法还将执行一个ajax调用来获取车辆详细信息。让我的构造函数调用setIntervalfunction{vehicle.update;},10000这样的函数是否可以接受;当.getJSON方法返回时?@Terry将以10秒的间隔运行代码。同样,您不知道.getJSON回调何时完成。它可能会超过10秒,而且永远不会。然而,出于您的目的,它可能会起作用。我仍然喜欢在异步加载期间延迟。哇,Stackoverflow用户真是太棒了。我还是有点困惑。。。但是我的JSON请求是获取车辆的初始参数-move函数还没有完成,应该做一些类似于完成时所描述的事情!:-@Terry需要了解的重要一点是,$.getJSON的回调函数第三个参数在调用.move之前可能不会运行。事实上,这是极不可能的。不仅如此,它可能永远不会运行!如果你真的需要异步加载初始值,你可以设置一个加载弹出窗口或其他什么,并阻止任何其他调用,直到这是doneThanks的家伙-我理解异步方法的含义-我想。我已经放弃了.move方法,因为我只是用它来测试。实际上,我将使用一个.update方法,该方法还将执行一个ajax调用来获取车辆详细信息。让我的构造函数调用setIntervalfunction{vehicle.update;},10000这样的函数是否可以接受;当.getJSON方法返回时?@Terry将以10秒的间隔运行代码。同样,您不知道.getJSON回调何时完成。它可能会超过10秒,而且永远不会。然而,出于您的目的,它可能会起作用。我还是宁愿推迟 环控异步加载。