javascript 异步函数返回未定义的值,尽管存在.then()和await构造[duplicate]

kokeuurv  于 2023-02-21  发布在  Java
关注(0)|答案(1)|浏览(131)
    • 此问题在此处已有答案**:

(41个答案)
昨天关门了。
我正在通过API从一个名为pollPowerConsumption()的通用异步函数中调用一个名为fetchPowerConsumption()的异步函数来轮询一些JSON数据,这样做效果很好,而且我可以从fetchPowerConsumption()中调用console.log()响应,它显示了有效的数据;然而,当从pollPowerConsumption()中记录时,我总是得到"未定义"。即使我等待live_power_consumption,它也不会从fetchPowerConsumption()返回。
为什么Promise没有实现?
我的代码如下:

<!DOCTYPE html>
<html>
    <head>       
    </head>
    <body>  
    
    
    <script>
    
let mySmartThingsToken = '<hidden>';
let mySmartThingsDeviceId = '<hidden>';

pollPowerConsumption();

async function pollPowerConsumption() {

    var live_power_consumption = await fetchPowerConsumption();

    console.log(live_power_consumption);

}

async function fetchPowerConsumption() {

    var myRequestHeaders = new Headers();
    myRequestHeaders.append("Authorization", "Bearer " + mySmartThingsToken);

    var myRequestOptions = {
        method: 'GET',
        cache: 'no-cache',
        headers: myRequestHeaders,
        redirect: 'follow'
    };

    await fetch("https://api.smartthings.com/v1/devices/" + mySmartThingsDeviceId + "/status", myRequestOptions).then(async function(response) {

        // response.json() returns a promise, use the same .then syntax to work with the results
        await response.json().then(async function(SmartThingsData) {

            // SmartThingsData is now our actual variable parsed from the json, so we can use it                                    

            //console.log(SmartThingsData["components"]["main"]["powerMeter"]["power"]["value"]);                       

            return SmartThingsData["components"]["main"]["powerMeter"]["power"]["value"];

        });
    }).catch(requestError => console.log(requestError));

}
    </script>
        
    
    </body>
</html>

live_power_consumption应该返回fetchPowerConsumption()正在提供的任何内容。

czq61nw1

czq61nw11#

fetchPowerConsumption()函数实际上没有返回任何内容。尽管它使用await和.then()语法来处理响应的异步获取和解析,但return语句位于传递给响应的.then()方法的嵌套函数中。
使用异步函数时,可以使用await关键字等待Promise的结果解析,但函数本身必须返回Promise,以便调用代码能够等待其结果。若要修复代码,可以从fetchPowerConsumption()函数返回嵌套的Promise链。

async function fetchPowerConsumption() {

    var myRequestHeaders = new Headers();
    myRequestHeaders.append("Authorization", "Bearer " + mySmartThingsToken);

    var myRequestOptions = {
        method: 'GET',
        cache: 'no-cache',
        headers: myRequestHeaders,
        redirect: 'follow'
    };

    // Return the Promise chain to make the function return a Promise
    return fetch("https://api.smartthings.com/v1/devices/" + mySmartThingsDeviceId + "/status", myRequestOptions)
        .then(response => response.json())
        .then(SmartThingsData => SmartThingsData["components"]["main"]["powerMeter"]["power"]["value"])
        .catch(requestError => console.log(requestError));

}

相关问题