Skip to main content

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:

PatternMeaning
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