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

tam*_*ros 7 javascript jquery

在继续使用我的代码之前,我正在尝试获取用户的城市和国家/地区.似乎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 */
});
Run Code Online (Sandbox Code Playgroud)

我希望代码执行为:

step 1
step 2
step 3
Run Code Online (Sandbox Code Playgroud)

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

step 3
step 1
step 2
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ror*_*san 8

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();
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用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');
});
Run Code Online (Sandbox Code Playgroud)