javascript - 未处理的 Promise 拒绝未定义的属性

标签 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);

当我运行这个时,我收到以下错误 未处理的 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]
});

这还会为循环的每次调用创建一个新的 valindex 变量。

关于javascript - 未处理的 Promise 拒绝未定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260616/

相关文章:

javascript - 为什么最后两个函数起作用,而第一个不起作用?

node.js - Angular 2如何加载具有子依赖项的第3方供应商 Node 模块

c# - 使用 C# 中的 2D 字符串数组填充 JavaScript 数组

javascript - 单击单选按钮时事件的触发顺序是什么?

node.js - AWS Lambda 函数总是返回空值( Node/Javascript)?

javascript - JestJS:如何测试嵌套(异步)函数中的调用函数

mysql - 适用于 Node 和 MySQL 的数据库版本控制工具

javascript - 在 Google App Engine 中使用 Jquery 按顺序加载图像

javascript - 无效量词错误

javascript - 使用 javascript 处理 css 规则