2017-08-29 34 views
0

我正在Angular2中開發出價網站。我需要一個計時器每一個產品,它開始於60秒,當它到達0再次重置爲60需要定時器倒計時重置爲60,當以Observables結尾或以任何方式在Angular2中時

countDown; 
counter = 60; 

constructor() { 
     this.countDown = Observable.timer(0,1000) 
      .take(this.counter) 
      .map(() => --this.counter); 
} 

計數器60秒開始,並以0結束了,但我無法實現當它的值變爲0時,再次將60重新分配給計數器。

我對RxJs中的Obervables知之甚少。誰能幫我?

回答

1

歡迎來到Stack Overflow!

我們可以用一些數學來達到這個目的。 請閱讀獎金部分,看到另一種

this.countDown = Observable 
    .timer(0, 1000) // emits 0, 1, 2, 3, 4, 5, 6, 7, 8... 
    .map(tick => 60 - (tick % 60)); // emits 60, 59, 58... 0, 60, 59... 

我們正在分裂的其餘60 - tick % 60

1 % 60 = 1 
2 % 60 = 2 
... 
60 % 60 = 0 
61 % 60 = 1 
... 

如果我們想從60開始倒計時,然後我們需要減去從60

獎金(這個問題的答案在註釋)

0123分工休息

如果你想從一個隨機數開始,你必須在可觀測值中保持某種狀態。 scan運營商爲此提供服務。在這種情況下,使用timer運營商是一種矯枉過正,我們可以用interval來代替。

function getRandomNumber() { // returns a random integer from 1 to 60 
    return Math.floor(Math.random() * 60) + 1; 
} 

Observable 
     .interval(1000) // emits every second 
     // `scan` works like `reduce` method of the array 
     // it keeps its own internal state in `acc` 
     // `acc` initial value is random and when it reaches 1, it has a new random integer assigned to it again 
     .scan(acc => acc === 1 ? getRandomNumber() : acc - 1, getRandomNumber()); 
     // emits e.g. 5, 4, 3, 2, 1, 10, 9, 8, 7, 6... 

從技術上講,您可以通過用所需的數字替換getRandomNumber來解決原來的問題。

+0

如果我想開始countDowns隨機數字我該怎麼辦?例如:1.產品 - > 25秒 - > 60秒 - > 60秒; 2.產品 - > 14秒 - > 60秒 - > 60秒等 – Yusuf

+0

檢查我更新的答案。如果有幫助,請將此答案標記爲已接受。 –