JavaScript:异步情况
我有以下代码:JavaScript:异步情况,javascript,Javascript,我有以下代码: var IPMapper = { markerArray = []; addIPArray: function(ipArray) { ..... for (var i = 0; i < ipArray.length; i++) { IPMapper.addIPMarker(ipArray[i], i, ipArray.length, IPMapper.f_callback); }
var IPMapper = {
markerArray = [];
addIPArray: function(ipArray) {
.....
for (var i = 0; i < ipArray.length; i++) {
IPMapper.addIPMarker(ipArray[i], i, ipArray.length, IPMapper.f_callback);
}
return IPMapper.markerArray;
},
addIPMarker: function(ip, i, ip_array_length) {
var url = encodeURI(IPMapper.baseUrl + ip + "?callback=?");
$.getJSON(url, function(data) {
var latitude = data.latitude;
var longitude = data.longitude;
var latlng = new google.maps.LatLng(latitude, longitude);
var marker = new google.maps.Marker({
draggable: false,
position: latlng
});
IPMapper.markerArray.push(marker);
}
}
}
但我得到一个空数组。如何返回填充数组?我需要从callIPMapper.addIPArray
返回结果。我尝试回调IPMapper.addIPMarker
,但这不是我需要的(我只需要调用一个函数并得到结果(某些情况下会在RoR中进行下一次缓存))。请对此发表任何意见。一个(坏)选项是使用$.ajax
而不是$.getJSON
,在这里您可以设置async=false
,但是async=false
不受欢迎,因此强烈反对
更好的选择是使用.done()
在回调函数中分配值。然后,您可以将其作为IPMapper
对象的属性公开,而不是从addIPArray
返回IPMapper.markerary
。然后考虑在Ajax调用完成时发出一个事件信号,在该事件的处理程序中,Access <代码> IPMAPPER。
但我得到一个空数组。如何返回填充数组?我需要
从调用IPMapper.addIPArray返回结果。我试着回电话给你
但这不是我需要的(我只需要调用一个)
函数并得到结果(某些情况下,RoR中的下一个缓存)。请
有什么评论吗
您只能从IPMapper.addIPArray返回一个承诺。您不能从异步操作返回任何其他内容,因为它是异步的,javascript无法知道结果何时可用。因此
addIPMarker: function(ip, i, ip_array_length) {
var url = encodeURI(IPMapper.baseUrl + ip + "?callback=?");
return $.getJSON(url, function(data) {
var latitude = data.latitude;
var longitude = data.longitude;
var latlng = new google.maps.LatLng(latitude, longitude);
var marker = new google.maps.Marker({
draggable: false,
position: latlng
});
IPMapper.markerArray.push(marker);
}
然后
异步操作类似于单击某个对象并希望代码在单击事件时执行某个对象。您无法知道单击何时发生,只能编写一个单击事件处理程序。请参阅和
addIPMarker: function(ip, i, ip_array_length) {
var url = encodeURI(IPMapper.baseUrl + ip + "?callback=?");
return $.getJSON(url, function(data) {
var latitude = data.latitude;
var longitude = data.longitude;
var latlng = new google.maps.LatLng(latitude, longitude);
var marker = new google.maps.Marker({
draggable: false,
position: latlng
});
IPMapper.markerArray.push(marker);
}
IPMapper.addIPArray(/*..arguments..*/).done( function(result) {
//continue the code here
});