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);
当我运行这个时,我收到以下错误
未处理的 promise 拒绝类型错误:
无法读取未定义的“getconspiration”属性。
当我用一个值替换索引时,上面的代码运行良好。要仅检索一个值,它是有效的。当它处于 For 循环中时,将返回错误消息。请帮我解决这个问题。
最佳答案
您正在尝试在异步回调中使用 for
循环索引值。问题在于 .then()
处理程序是在 for
循环完成之后调用的,因此 for
循环索引位于其终端当您尝试使用它时,它的值(超出数组末尾)。
有很多方法可以解决这个问题。一种简单的方法是改变这一点:
for(i=1;i<=len;i++)
对此:
for(let i=1;i<=len;i++)
使用 ES6 let
为每次执行 for
循环创建一个新的唯一变量,以便每个循环都维护自己的索引副本,即使在循环期间也是如此。 for
循环 block 内的异步调用。
在 ES5 中(没有 let
),您可以更改循环以使用 .forEach()
:
plug.forEach(function(val, index) {
// use val and index here rather than plug[i]
});
这还会为循环的每次调用创建一个新的 val
和 index
变量。
关于javascript - 未处理的 Promise 拒绝未定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260616/