Fala rapaziada, bom dia.
Eu to estudando JS ultimamente e praticando por aqui e me deparei com uma situação, o ajax ta respondendo depois que o script já executou e por consequência a minha variável IP (linha 92) está retornando indefinida, pq o ajax só responde depois, desconfio que seja algo relacionado à callback/async/sync.
Segue o código completo abaixo e pra fins de aprendizado, se quiserem me dar alguma orientação no que remover/otimizar/adicionar/encurtar no script em geral, ficarei bastante grato pela sua orientação. obs1: Não desejo mexer com jquery por enquanto.
obs2: Os dados estão retornando corretamente no return da linha 85, que no caso é um IP.
obs3: Havia feito uma function pro ajax da linha 93 em diante e chamei dentro do ajax anterior na linha 85, funcionou perfeitamente e pegou o IP, porém achei meio esquisito e não sei se é uma boa prática colocar ajax dentro de ajax e retornei o código na forma como está logo abaixo.   erro: variável ( ip ) indefinida na linha 92 possível causa: ajax da linha 80-91 é executado só depois que o script já carregou por completo e me retorna indefinido na variável IP.   Desde já agradeço a ajuda rapaziada, abração, bom dia e fiquem com Deus.   segue o código específico: function ajx(idx,dm){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { rt = JSON.parse(this.responseText); return rt[idx]; // retorna o ip corretamente } } xhr.open("GET","https://"+ dm +"/data/getData.php",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send(); }; var ip = ajx("ip",h); // retorna indefinido   segue o código completo: function pushRADS(){ var p = window.location.href; var u = new URL(p); var s = u.searchParams.get("utm_source"); var c = u.searchParams.get("utm_campaign"); var m = u.searchParams.get("utm_medium"); var t = u.searchParams.get("utm_term"); var h = window.location.hostname; var ck = document.cookie; var dt = document.getElementById("rads"); var ln = navigator.language; var pf = navigator.platform; var agt = navigator.userAgent; var ds = dt.dataset.device; var vs; var nf; var bw = "unknown"; var v = "unknown"; if ((vs = agt.indexOf('Opera')) != -1) { bw = 'Opera'; v = agt.substring(vs + 6); if ((vs = agt.indexOf('Version')) != -1) { v = agt.substring(vs + 8); } } if ((vs = agt.indexOf('OPR')) != -1) { bw = 'Opera'; v = agt.substring(vs + 4); } else if ((vs = agt.indexOf('Edge')) != -1) { bw = 'Microsoft Edge'; v = agt.substring(vs + 5); } else if ((vs = agt.indexOf('MSIE')) != -1) { bw = 'Microsoft Internet Explorer'; v = agt.substring(vs + 5); } else if ((vs = agt.indexOf('Chrome')) != -1) { bw = 'Chrome'; v = agt.substring(vs + 7); } else if ((vs = agt.indexOf('Safari')) != -1) { bw = 'Safari'; v = agt.substring(vs + 7); if ((vs = agt.indexOf('Version')) != -1) { v = agt.substring(vs + 8); } } else if ((vs = agt.indexOf('Firefox')) != -1) { bw = 'Firefox'; v = agt.substring(vs + 8); } else if (agt.indexOf('Trident/') != -1) { bw = 'Microsoft Internet Explorer'; v = agt.substring(agt.indexOf('rv:') + 3); } else if ((nf = agt.lastIndexOf(' ') + 1) < (vs = agt.lastIndexOf('/'))) { bw = agt.substring(nf, vs); v = agt.substring(vs + 1); if (bw.toLowerCase() == bw.toUpperCase()) { bw = navigator.appName; } } bwv = "browser: " + bw + " | version: " + v; if(screen.width <= 640){ dv = "mobile"; var mob = ["Android","webOS","iPhone","iPad","iPod","BlackBerry","Windows Phone"]; for (var i = 0;i < mob.length;i++) { var re = new RegExp(mob[i], 'i'); if(navigator.userAgent.match(re)){ ua = mob[i] + " " + navigator.userAgent; } }; } else { dv = "desktop"; ua = navigator.userAgent; } if(ck == "" && s && c && m && t && (dv == ds || ds == "all")){ var tm = dt.dataset.timeAd; setTimeout(function(){ var ct = dt.dataset.cookieAd; var d = new Date(); d = new Date(d.getTime() + 1000 * ct).toGMTString(); document.cookie = "utm_source="+s+"; expires="+d+";"; document.cookie = "utm_term="+t+"; expires="+d+";"; document.cookie = "utm_medium="+m+"; expires="+d+";"; function ajx(idx,dm){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { rt = JSON.parse(this.responseText); return rt[idx]; } } xhr.open("GET","https://"+ dm +"/data/getData.php",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhr.send(); }; var ip = ajx("ip",h); var xhttp = new XMLHttpRequest(); xhttp.open("POST","https://"+ h +"/ad/getDataAd.php",true); xhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xhttp.send("id_publisher="+t+"&id_campaign="+c+"&ad_source="+s+"&ad_type="+m+"&ip_client="+ip+"&device_source="+dv+"&device_type="+ua+"&device_lang="+ln+"&device_platform="+pf+"&browser="+bwv); },tm); } }