Defer
defer schedules a function to run after ms milliseconds, without blocking the caller. It returns a future you can await for the result (or error).
std.async.defer(fn, ms[, args...]) // → future
Basic usage
var f = std.async.defer(fn(name) {
return "delayed, " + name
}, 100, "scrii")
print(std.async.await(f)) // delayed, scrii (after ~100 ms)
Differences from spawn + sleep:
| Pattern | Meaning |
|---|---|
spawn(fn) { sleep(100); return x } | Fiber starts now, sleeps internally |
defer(fn, 100, args) | Fiber starts after 100 ms |
Use defer when you want the start delayed (timers, debounced work). Use spawn when you want it running now.
Arguments
Args are deep-copied at defer time, like spawn:
var f = std.async.defer(fn(a, b) { return a + b }, 50, 10, 20)
print(std.async.await(f)) // 30
Example — delayed log
print("now:", std.time.now())
var f = std.async.defer(fn() {
print("later:", std.time.now())
return "done"
}, 200)
print(std.async.await(f)) // done
Cancellation
defer futures are not cancellable. For cancellable delayed work use std.time.timer({callback, duration, repeat: false}) which returns a future you can await, or a repeating timer's handle with cancel() (see std.time).
See also
- Spawn & Await — immediate concurrency
- Sleep — cooperative delay
- Race — first-to-finish among defers/spawns
- Errors — defer errors are stored on the future like spawn