异步/等待,XHR 请求后返回的变量未定义

Kri*_*iiV 5 javascript async-await

我正在尝试从 API 获取公共 IP 地址,然后将该 IP 用于另一个函数 ( ninjaUniqueVisitorRequest())。

我有以下代码:

function ninjaGetIp() {
    var ipRequest = new XMLHttpRequest();
    ipRequest.open('GET', "https://api.ipify.org?format=jsonp=", true);
    ipRequest.send();
    ipRequest.onload = function () {
        if (ipRequest.status >= 200 && ipRequest.status < 400) { // If response is all good...
            return ipRequest.responseText;
        } else {
            console.log('There was an error retrieving the public IP.');
            return '127.0.0.1'; 
        }
    }
}

async function ninjaUniqueVisitorRequest() {
    // var ninjaSiteUuid = ninjaGetSiteUuid();
    // var ninjaFingerprint = await ninjaGetFingerprint();
    var ninjaPublicIp = await ninjaGetIp();
    console.log(ninjaPublicIp);
}
Run Code Online (Sandbox Code Playgroud)

目前,当我运行ninjaUniqueVisitorRequest();console.log(ninjaPublicIp);回报undefined

我有点理解它在发出请求之前立即返回,但这就是我认为我正在通过使用async/await.

任何想法表示赞赏!PHP 家伙在这里,放轻松。

Joj*_*rte 5

目前你ninjaGetIp不是一个 awaitable Promise

您可以尝试仅返回一个Promise包装实现的 new或仅async在函数之前添加关键字。

function ninjaGetIp() {
    return new Promise(function (resolve, reject) {
        var ipRequest = new XMLHttpRequest();
        ipRequest.open('GET', "https://api.ipify.org?format=jsonp=", true);
        ipRequest.send();
        ipRequest.onload = function () {
            if (ipRequest.status >= 200 && ipRequest.status < 400) { // If response is all good...
                return resolve(ipRequest.responseText);
            } else {
                console.log('There was an error retrieving the public IP.');
                return resolve('127.0.0.1'); 
            }
        }
    });
    
}
Run Code Online (Sandbox Code Playgroud)

异步示例

async function ninjaGetIp() {
            var ipRequest = new XMLHttpRequest();
            ipRequest.open('GET', "https://api.ipify.org?format=jsonp=", true);
            ipRequest.send();
            ipRequest.onload = function () {
                if (ipRequest.status >= 200 && ipRequest.status < 400) { // If response is all good...
                    return ipRequest.responseText;
                } else {
                    console.log('There was an error retrieving the public IP.');
                    return '127.0.0.1'; 
                }
            }
        
    }
Run Code Online (Sandbox Code Playgroud)