从 influxdb-query 返回值时如何修复 "Promise { <pending>}"?

How to fix "Promise { <pending>}" when returning values from influxdb-query?

我想从多个节点的 influxdb 中获取时间跨度的平均值。 我使用 promise 函数来获得同步结果。

问题:
即使在函数完成后,承诺仍未决。

我该如何解决这个问题?

我是 NodeJs 的新手,所以请不要讨厌。

系统设置:
OS:Ubuntu 18.04 LTS(服务器)| NodeJs: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 ]

执行 console.log 时,承诺尚未完成。

请看一下这个问题:

我建议你使用 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));
}