@@ -282,10 +282,16 @@ impl Timer {
282282 /// [`never()`] will never fire, and timers created with [`after()`] or [`at()`] will fire
283283 /// if the duration is not too large.
284284 ///
285+ /// [`never()`]: Timer::never()
286+ /// [`after()`]: Timer::after()
287+ /// [`at()`]: Timer::at()
288+ ///
285289 /// # Examples
286290 ///
287291 /// ```
292+ /// # futures_lite::future::block_on(async {
288293 /// use async_io::Timer;
294+ /// use futures_lite::prelude::*;
289295 /// use std::time::Duration;
290296 ///
291297 /// // `never` will never fire.
@@ -294,6 +300,19 @@ impl Timer {
294300 /// // `after` will fire if the duration is not too large.
295301 /// assert!(Timer::after(Duration::from_secs(1)).will_fire());
296302 /// assert!(!Timer::after(Duration::MAX).will_fire());
303+ ///
304+ /// // However, once an `after` timer has fired, it will never fire again.
305+ /// let mut t = Timer::after(Duration::from_secs(1));
306+ /// assert!(t.will_fire());
307+ /// (&mut t).await;
308+ /// assert!(!t.will_fire());
309+ ///
310+ /// // Interval timers will fire periodically.
311+ /// let mut t = Timer::interval(Duration::from_secs(1));
312+ /// assert!(t.will_fire());
313+ /// t.next().await;
314+ /// assert!(t.will_fire());
315+ /// # });
297316 /// ```
298317 #[ inline]
299318 pub fn will_fire ( & self ) -> bool {
@@ -473,6 +492,8 @@ impl Stream for Timer {
473492 // Register the timer in the reactor.
474493 let id = Reactor :: get ( ) . insert_timer ( next, cx. waker ( ) ) ;
475494 this. id_and_waker = Some ( ( id, cx. waker ( ) . clone ( ) ) ) ;
495+ } else {
496+ this. when = None ;
476497 }
477498 return Poll :: Ready ( Some ( result_time) ) ;
478499 } else {
0 commit comments