从influxdb-query返回值时,如何解决“ Promise {<pending>}”问题?

时间:2019-09-03 07:52:55

标签: node.js promise influxdb

我想从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 ]

1 个答案:

答案 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));
}