@@ -282,10 +282,16 @@ impl Timer {
282
282
/// [`never()`] will never fire, and timers created with [`after()`] or [`at()`] will fire
283
283
/// if the duration is not too large.
284
284
///
285
+ /// [`never()`]: Timer::never()
286
+ /// [`after()`]: Timer::after()
287
+ /// [`at()`]: Timer::at()
288
+ ///
285
289
/// # Examples
286
290
///
287
291
/// ```
292
+ /// # futures_lite::future::block_on(async {
288
293
/// use async_io::Timer;
294
+ /// use futures_lite::prelude::*;
289
295
/// use std::time::Duration;
290
296
///
291
297
/// // `never` will never fire.
@@ -294,6 +300,19 @@ impl Timer {
294
300
/// // `after` will fire if the duration is not too large.
295
301
/// assert!(Timer::after(Duration::from_secs(1)).will_fire());
296
302
/// 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
+ /// # });
297
316
/// ```
298
317
#[ inline]
299
318
pub fn will_fire ( & self ) -> bool {
@@ -473,6 +492,8 @@ impl Stream for Timer {
473
492
// Register the timer in the reactor.
474
493
let id = Reactor :: get ( ) . insert_timer ( next, cx. waker ( ) ) ;
475
494
this. id_and_waker = Some ( ( id, cx. waker ( ) . clone ( ) ) ) ;
495
+ } else {
496
+ this. when = None ;
476
497
}
477
498
return Poll :: Ready ( Some ( result_time) ) ;
478
499
} else {
0 commit comments