未处理的承诺拒绝未定义的属性

时间:2017-11-13 09:12:59

标签: javascript node.js

setInterval(function(){

    for(i=1;i<=len;i++)
    {

        plug[i].getSysInfo().then(data => {

            var json = JSON.stringify(data,undefined,2);

            var obj = JSON.parse(json);
            var _macadd = obj.mac;

            plug[i].getConsumption().then(data => {

                var json = JSON.stringify(data,undefined,2);
                var obj = JSON.parse(json);
                var _current = obj.current;
                var _voltage = obj.voltage;
                var _power = (obj.power).toPrecision(5);
                var _total = obj.total;
                var _err_code = obj.err_code;
                console.log(_power);
                //console.log(_macadd);
                //console.log(voltage);
                if(_power > 1800)
                {
                    _power = 0.00;
                }
                //  var fs = require('fs');
                //  fs.writeFile("emeter.json", json);

                var sql1 = "INSERT INTO emeter SET ? ";
                var post1  = { macaddress: _macadd,current: _current,voltage: _voltage,power: _power, total: _total,err_code: _err_code};


                var tmp = JSON.stringify(post1,undefined,2);
                console.log(tmp);
                con.query(sql1, post1, function (err, result) {
                    if (err) throw err;
                    console.log("inserted");
                });

            });
        });
    }

},30000);

我在运行时遇到错误 未处理的承诺拒绝类型错误: Cannot read property of 'getconsumption' of undefined.

当我用一个值替换索引时,上面的代码运行良好。只检索一个值,它正在工作。当它在For循环中时,则返回错误消息。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

您尝试在异步回调中使用for循环索引值。问题是.then()处理程序在for循环已经完成之后被调用,因此当您尝试for循环索引处于其终值(超出数组末尾)时使用它。

有很多方法可以解决这个问题。一种简单的方法是改变这种情况:

for(i=1;i<=len;i++)

到此:

for(let i=1;i<=len;i++)

使用ES6 letfor循环的每次执行创建一个新的唯一变量,以便每个循环都维护自己的索引副本,即使在{{1}内的异步调用期间也是如此。 1}}循环块。

在ES5中(您没有for),您可以更改循环以使用let

.forEach()

这也为每次循环调用创建一个新的plug.forEach(function(val, index) { // use val and index here rather than plug[i] }); val变量。