我想从influxdb获取多个节点的时间跨度的平均值。 我正在使用promise函数来获取同步结果。
问题:
即使功能完成后,promise仍未完成。
该如何解决?
我是NodeJ的新手,所以请不要讨厌。
系统设置程序:
操作系统:Ubuntu 18.04 LTS(Server)| NodeJ:v12.8.1 | InfluxDB Shell:0.12.2
这是我正在使用的代码。我添加了console.logs来查看错误在哪里。
function parseData(go1, go2, mac, zeit, meter) {
var anz = go1[0].count;
var transfer = [];
for (i = 0; i < anz; i++) {
transfer.push(checkValue(i, go2, mac, zeit, meter, anz))
}
console.log(transfer);
}
function checkValue(i, go2, mac, zeit, meter, anz){
return new Promise(function(resolve, reject){
var Node = go2[i].distinct;
var query = `select mean(rssi) from "` + mac +`" where time > (now() - ` + zeit + `m) AND rssi < ` + meter + ` AND Node = '` + Node + `'`;
console.log(query);
influx.query(
query
)
.then(
result=>{
var pars = result;
var res = pars[0].mean;
var eintrag = [];
eintrag.push(Node);
eintrag.push(res);
console.log(eintrag);
return resolve([eintrag]);
}
);
});
}
这是我当前的console.log
select mean(rssi) from "75*****500eb" where time > (now() - 3600m) AND rssi < 20 AND Node = 'ble*1*pi'
select mean(rssi) from "75*****500eb" where time > (now() - 3600m) AND rssi < 20 AND Node = 'ble*2*pi'
[ Promise { <pending> }, Promise { <pending> } ]
[ 'ble*1*pi', 9.027241718321147 ]
[ 'ble*2*pi', 18.86637795689184 ]
答案 0 :(得分:-1)
执行console.log
时,承诺尚未完成。
请查看以下问题:How to return many Promises in a loop and wait for them all to do other stuff
我建议您使用await Promise.all
:
const main = async () => {
const arrayOfResults = await Promise.all([checkValue(...), checkValue(...)])
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
在您的特定情况下,您可以执行以下操作:
async function parseData(go1, go2, mac, zeit, meter) {
var anz = go1[0].count;
var transfer = [];
for (i = 0; i < anz; i++) {
transfer.push(checkValue(i, go2, mac, zeit, meter, anz))
}
console.log(await Promise.all(transfer));
}