Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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:异步情况_Javascript - Fatal编程技术网

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);
        }
    }
}
但我得到一个空数组。如何返回填充数组?我需要从call
IPMapper.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
            });