javascript – 等待函数完成 – 执行是异步的(不按顺序)

在继续使用我的代码之前,我正在尝试获取用户的城市和国家/地区.似乎 javascript没有按照我需要的顺序执行.
$(document).ready(function() {    
  var country,city = '';

  function geoData() {
    $.getJSON('http://ipinfo.io/json?callback=?',function (data) { 
      console.log('step 1');
      country = data.country;
      city = data.city;
      console.log('step 2');
    });
  };

  geoData();        
  console.log('step 3');

  /* rest of the code */
});

我希望代码执行为:

step 1
step 2
step 3

但是,当我运行脚本时,我得到:

step 3
step 1
step 2

为什么代码以异步方式运行?有什么建议我可以解决它吗?

谢谢.

解决方法

AJAX请求是异步的 – 它是第一个A代表的.如果您的逻辑依赖于请求返回的数据,则需要将其置于回调函数中.试试这个:
var country,city = '';

function geoData() {
    $.getJSON('http://ipinfo.io/json?callback=?',function (data) { 
        console.log('step 1');
        country = data.country;
        city = data.city;
        console.log('step 2');

        step3();
    });
};

function step3() {
    console.log('step 3');
}

geoData();

另一种方法是使用promise,尽管逻辑流程大致相同:

var country,city = '';

function geoData() {
    return $.getJSON('http://ipinfo.io/json?callback=?',function (data) { 
        console.log('step 1');
        country = data.country;
        city = data.city;
        console.log('step 2');
    });
};

var deferred = geoData();
$.when(deferred).done(function() {
    console.log('step 3');
});

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...