您好我试图在延迟一秒后刷新对象内的属性值我正在使用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
中调用函数时,值不正确。
答案 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,我已经更新了答案。