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

Neither defer nor one-shot futures are cancellable: await waits for
completion, it does not stop anything. The only cancellation mechanism in
the system is a repeating timer’s handle — t.cancel() prevents further
ticks (see std.time). To abandon one-shot work,
structure it so the result is simply ignored (see Race).

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