【发布时间】:2012-05-10 01:27:13
【问题描述】:
我很难理解为什么 this.$map 和 this.markers 未定义。这是我正在使用的代码,我添加了 cmets,我希望这些变量提供一个值:
(function($) {
'use strict';
var A = {
/**
* Initialize the A object
*/
init: function() {
this.$map = this.renderMap();
this.markers = this.getMarkers();
this.renderMarkers();
},
renderMap: function() {
var url = 'http://a.tiles.mapbox.com/v3/delewis.map-i3eukewg.jsonp';
// Get metadata about the map from MapBox
wax.tilejson(url, function(tilejson) {
var map = new L.Map('map', {zoomControl: false});
var ma = new L.LatLng(42.2625, -71.8028);
map.setView(ma, 8);
// Add MapBox Streets as a base layer
map.addLayer(new wax.leaf.connector(tilejson));
return function() {
return map;
};
});
},
renderMarkers: function() {
var geojsonLayer = new L.GeoJSON(null, {
pointToLayer: function (latlng){
return new L.CircleMarker(latlng, {
radius: 8,
fillColor: "#ff7800",
color: "#000",
weight: 1,
opacity: 1,
fillOpacity: 0.8
});
}
});
geojsonLayer.addGeoJSON(this.markers); // this.markers is undefined
this.$map.addLayer(geojsonLayer); // this.$map is undefined
},
getMarkers: function() {
$.getJSON("/geojson/", function (data) {
return data;
});
}
};
/**
* A interactions
*/
$(document).ready(function() {
A.init()
});
})(jQuery.noConflict());
我花了一天的大部分时间搜索,我认为我在这里遗漏了一些基本的东西,但我不明白。
【问题讨论】:
-
因为您不能(可以说不应该)从 Ajax 调用返回值... Ajax 默认是异步。如果可以直接返回值,为什么还要传递回调?请阅读jQuery: Return data after ajax call success。这部分是范围问题,但主要是时间问题。
-
看看
getMarkers。该函数不返回值。您传递给$.getJSON的回调确实如此,但该回调由(内部)$.getJSON执行,因此它将值返回给$.getJSON,而不是调用getMarkers的函数。此外,当收到响应并且当时getMarkers已经完成(返回undefined)时,将执行回调。从字面上看(我假设)这里有成千上万个问题都是关于同一个问题的。 -
必须有数千个,很容易。有一天,我在几个小时内统计了 8 个新的“异步事物不返回值”问题。假设每天发布大约 8 个这样的帖子,那么到目前为止,在网站的整个生命周期内,这将是大约 3 万个。
-
@GGG,我没有意识到这两种情况都是 ajax 调用。我傻吗?是的,它让我找错地方了。
-
@MarkLewis 您将回调传递给名称中带有“json”的函数这一事实应该是一个很大的暗示,即您正在调用的函数是异步的,并且您正在返回的事实来自回调的事情应该是一个危险信号。
标签: javascript jquery scope