JavaScript:异步案例

JavaScript: asynchronous case

本文关键字:案例 异步 JavaScript      更新时间:2023-09-26

我有以下代码:

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() 在回调函数中分配值。然后,您可以将其公开为IPMapper对象的属性,而不是从addIPArray返回IPMapper.markerArray,并在以后获取它。然后考虑引发一个事件,指示它在 ajax 调用完成时准备就绪,并在该事件的处理程序中,访问IPMapper.markerArray来执行您需要执行的操作。

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

你唯一能从IPMapper.addIPArray返回的就是一个承诺。你不能从异步操作返回任何其他内容,因为它是异步的,javascript 不知道结果何时会 available.so

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

http://api.jquery.com/category/deferred-object/

异步操作类似于单击某些内容,并且希望代码在单击事件时执行某些内容。你无法知道点击何时会发生,你所能做的就是编写一个点击事件处理程序。