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);
        }
        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);
        }
    }
}

我试过:

IPMapper.addIPArray(array_with_ips);

但是我得到一个空数组。我如何返回一个填充数组?我需要调用 IPMapper.addIPArray 的返回结果。我尝试为 IPMapper.addIPMarker 进行回调,但这不是我需要的(我只需要调用一个函数并获得结果(在 RoR 中进行下一次缓存的某些情况))。请对此发表任何评论。

最佳答案

一个(不好的)选项是使用 $.ajax 而不是 $.getJSON,您可以在其中设置 async=false,但是async=false 已弃用,因此强烈建议不要使用。

更好的选择是使用 .done() 在回调函数中分配值。然后,不用从 addIPArray 返回 IPMapper.markerArray,您可以将其公开为您的 IPMapper 对象的属性,并在以后获取它。然后考虑在 ajax 调用完成时引发一个事件,表明它已准备就绪,并在该事件的处理程序中访问 IPMapper.markerArray 以执行您需要执行的操作。

关于JavaScript:异步案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22723397/

相关文章:

javascript - HTML/Javascript - 将文本区域的高度与另一个文本区域的高度相关联?

javascript - Firestore onSnapshot() 方法多次触发

javascript - 时刻: Deprecation warning: moment construction falls back to js Date

javascript - 当达到字符限制时,如何在字符串中添加换行符而不破坏单词?

javascript - jQuery 用另一个替换给定的链接

javascript - 等待 nightwatchjs 中的元素不再被禁用

javascript - 拖放到 HTML 对象标签上

javascript - 代码无法在 Dreamweaver 中的 jsFiddle 之外工作

javascript - Google 柱形图 - 列值与轴不匹配

javascript - 使用 Passport JS 给出错误的请求