尽管 .then() 和 await 构造异步函数返回未定义的值 [重复]

问题描述 投票:0回答:1

我正在通过 API 轮询一些 JSON 数据,方法是从一个名为 fetchPowerConsumption() 的通用异步函数调用一个名为 pollPowerConsumption() 的异步函数。这很好用,我可以 console.log() 内的响应 fetchPowerConsumption(),它展示了有效的数据;然而,当从 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() 服务。

javascript asynchronous async-await promise
1个回答
0
投票

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));

}
© www.soinside.com 2019 - 2024. All rights reserved.