2017-10-04 126 views
1

你好我想我使用setInterval函数的属性我得到的这个目的,但价值一秒的延迟后刷新对象内部的属性值是不正确的更改对象的属性在Javascript

  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

这不是你如何使用['setInterval'](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval#Return_value) - 它不会返回'showPlaybackData'函数就像你期望的那样。 –

+0

'setInterval'不返回所需的值。 'setInterval'返回一个用于跟踪定时器的数字。您需要提供更多关于您想要实现的数据。 – Panther

+0

@KarlReid我如何获得所需的数据任何解决方案? –

回答

0

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小号。

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瑞德:感谢名单卡尔,我已经更新了答案。

+0

这有什么用? 'nextlvl'的值在以太网中仍然丢失,因为它不能被返回,所以根本没有必要调用该函数。 –