2017-10-04 123 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'的值在以太網中仍然丟失,因爲它不能被返回,所以根本沒有必要調用該函數。 –