javascript - 在循环数组时发出 json 请求和存储值的正确方法是什么?

标签 javascript jquery arrays json ajax

我想循环访问地址数组,以便我可以使用谷歌地图地理编码 API 请求它们各自的地理位置。我无法将结果(纬度/经度坐标)推送到数组中。看起来下面的 console.log 函数在上面的代码完成执行之前就被触发了。

如果有人能指出这个 javascript 菜鸟正确的方向,我将不胜感激。

    function getCoords() {
      $.each(addressList, function(index, val) {
        $.getJSON('https://maps.googleapis.com/maps/api/geocode/json?address=' + val + '&key=apikey').done(function(data){
          coordsList.push(data.results[0].geometry.location);
        });
      });
      console.log(coordsList);
    }

最佳答案

您正在混契约(Contract)步和异步代码。正如您所怀疑的,您的 console.log 在请求完成之前就已触发。

jQuery 的延迟对象非常适合此类事情 - 即,当一堆异步代码完成时执行某些操作。

var reqs = []; //set up a container to log our async requests to Google
$.each(addressList, function(index, val) {
    reqs.push($.getJSON('https://maps.googleapis.com/maps/api/geocode/json?address=' + val + '&key=apikey').done(function(data){
        coordsList.push(data.results[0].geometry.location);
    }));
});

//when ALL async requests have completed, console.log.
$.when.apply(this, reqs).done(function() { console.log(coordsList); });

如果你是一个 JS 菜鸟,那么对 apply() 的需求有点超出了这个问题的范围,但本质上它是一种将数组传递给不需要数组的函数的方法但单独的论点。 $.when() 期望请求作为单独的参数传递,即 $.when(req1, req2, ...) 但我们的请求位于数组中; apply() 解决了这个问题。 Here's more on apply() .

关于javascript - 在循环数组时发出 json 请求和存储值的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38541409/

相关文章:

javascript - javascript 中 getelementbyid 内的变量不起作用

javascript - 用于打印附加图像的打印按钮

javascript - 我的下拉菜单中的链接不起作用

arrays - 我们如何根据运行时性能在两种排序算法之间切换?

javascript - 从现有对象数组创建新对象数组时出现引用错误?

asp.net-mvc - JQuery AJAX HandleErrorAttribute 部分 View

javascript - Angular 下拉菜单问题

ios - 如何将字符串中的整数数组转换为字符串数组?

java - 无法在java中声明长数组

javascript - Chrome 使用 Lightbox 调用服务器两次