未捕获的TypeError:无法读取属性' length'使用setInterval时未定义

时间:2015-08-23 03:51:39

标签: javascript jquery

我正在为DYI项目构建一个Web界面,我正面临一个我无法弄清楚的错误。希望你能帮我一臂之力。 (顺便说一句,我是js / jquery的初学者)

这是我遇到问题的一段代码。

var lights_array = [20, 24, 25, 15, 28, 13, 19, 22, 21, 23, 31, 26, 27, 14, 3, 9, 7, 5, 8, 4, 6, 17, 18, 10, 12, 11, 16, 29, 30]; 

function pull_light_status (lights_array){
    $.each(lights_array,function(myindex, myvalue){
        $.post( "resources/php/individual_json.php", { veraip: "10.20.174.10", device_id: + myvalue})
            .done(function (json) {
            var vera_obj = JSON.parse(json);
            var light_state = vera_obj["Device_Num_"+myvalue].states[1].value;
            if (light_state === "1") {
                $("#light"+myvalue).attr("src","resources/img/on_toggle.png");
            } else {
                $("#light"+myvalue).attr("src","resources/img/off_toggle.png");
            }
            console.log("Checkpoint - Loading light status");
        })  
    })
}

pull_light_status(lights_array);
setInterval(pull_light_status,10000);   //this is what is giving me issues

好的,这是我的问题。没有行setInterval(pull_light_status,10000);它可以正常工作,当页面加载时,它会加载我的灯光状态并相应地设置图像。

一旦我添加了行setInterval(pull_light_status,10000);,所以状态指示灯每10秒刷新一次(如果我手动将指示灯关闭)我不会每10秒获得一次检查点消息,而是每隔10秒我得到一个错误

我得到的错误是:

  

未捕获的TypeError:无法读取属性'长度'未定义的   n.extend.each @jquery-2.1.4.min.js:2   pull_light_status @ script2.js:66

PD。 scrip2.js的第66行就是这个    $.each(lights_array,function(myindex, myvalue){

希望您能够了解问题是什么以及如何解决问题。

提前致谢

2 个答案:

答案 0 :(得分:1)

当您使用该函数作为setInterval的回调时,您不会将该数组作为参数发送,因此尝试访问该数组的函数中的代码将失败。

您可以在代码周围放置一个函数包装器,以便可以使用参数

调用该函数
setInterval(function(){
  pull_light_status(lights_array);
},10000);

答案 1 :(得分:0)

或者与Guffa的答案相反,更改功能:

function pull_light_status (lights_array){

到此:

function pull_light_status (){

因为你的函数有一个命名参数,所以函数会将它用作局部变量。您的setInterval没有传递任何参数,因此该函数将其设置为undefined。如果省略函数参数,它将在函数范围之外查找并找到数组定义。