我正在通过 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()
服务。
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));
}