在Javascript中更改对象的属性

时间:2017-10-04 10:24:58

标签: javascript object setinterval

您好我试图在延迟一秒后刷新对象内的属性值我正在使用setInterval函数为此目的但我得到的属性值不正确

            var nextlvl = '';
            function showPlaybackData() {

                            if(j.nextLevel == -1){

                                nextlvl = '';

                            }else if(j.nextLevel == 0){

                                nextlvl = '240p';

                            }else if(j.nextLevel == 1){

                                nextlvl = '360p';

                            }else if(j.nextLevel == 2){

                                nextlvl = '480p';

                            }else if(j.nextLevel == 3){

                                nextlvl = '720p';

                            }else if(j.nextLevel == 4){

                                nextlvl = '1080p';

                            }
                            console.log(nextlvl);
                            return nextlvl;

                        }

                var g = {
                    id: -1,
                    label: 'auto(' + setInterval( showPlaybackData , 1000) +')',
                    selected: -1 === j.manualLevel
                };
                e.push(g)

属性标签的值应该是我根据条件设置的这些分辨率之一,但它显示14或18或15.任何解决方案? 当我使用console.log时,我在函数中得到准确的值但是当我在setInterval中调用函数时,值不正确。

3 个答案:

答案 0 :(得分:1)

您需要重构代码,以便在函数中使用nextlvl,而不是返回它。如果没有看到完整的代码,很难回答,但是这样的话:

var j = ....
var e = [];
var g = {
    id: -1,
    selected: -1 === j.manualLevel
};
function showPlaybackData() {
    var nextlvl = '';
    if(j.nextLevel == 8){
        nextlvl = '';
    }else if(j.nextLevel == 0){
        nextlvl = '240p';
    }else if(j.nextLevel == 1){
        nextlvl = '360p';
    }else if(j.nextLevel == 2){
        nextlvl = '480p';
    }else if(j.nextLevel == 3){
        nextlvl = '720p';
    }else if(j.nextLevel == 4){
        nextlvl = '1080p';
    }
    console.log(nextlvl);
    g.label = 'auto(' + nextlvl +')';
    e.push(g);
};

setInterval(showPlaybackData, 1000);

请注意,如果您不了解这些陈述,则应考虑查看switch陈述,以替代if/else

答案 1 :(得分:0)

setInterval返回一个标识符,允许您检索(例如,清除)计时器,而不是函数的结果。您不需要在循环函数中返回所需的值,而是需要在该循环中可以访问其范围的对象中设置一个值。

答案 2 :(得分:0)

这可能对你有用:

function showPlaybackData(jpassed) {                    
                        var nextlvl = '';
                        switch(jpassed.nextLevel) {
                            case '':
                                      nextlvl = '';
                                      break;
                            case '240p':
                                      nextlvl = '240p';
                                      break;
                            case '360p':
                                      nextlvl = '360p';
                                      break;
                            case '480p':
                                      nextlvl = '480p';
                                      break;
                            case '720p':
                                      nextlvl = '720p';
                                      break;
                            case '1080p':
                                      nextlvl = '1080p';
                                      break;
                            default:
                                // any default logic
                        }
                        console.log(nextlvl);
                        return nextlvl;
}

然后在setinterval:

中更新你的对象
var j = ...
var g = {
             id: -1,
             label:'',
             selected: -1 === j.manualLevel
         };
setInterval(function(){
                          g.label = 'auto(' +showPlaybackData(j)+')' ;
                          e.push(g)                              
                    },2000,j,showPlaybackData,g);

@Karl Reid:Thanx Karl,我已经更新了答案。