A JavaScript-inspired, ergonomic, and composable Promise type for Rust, supporting background work, chaining, and error handling with Result.
- ECMAScript 5-style promises with Rust's type safety
- Chaining with
.then,.map, and.map_err - Combinators:
Promise::all,Promise::race - Panic-safe: panics in promise tasks are detected and reported
- Fully documented with tested examples
- Timeout and deadline support: Wait with [
wait_timeout] or [wait_deadline] - Safe and unsafe waiting: Choose between [
wait] (safe, double Result) and [wait_nopanic] (unsafe, panics on background panic)
Add to your Cargo.toml:
promisery = "2.0"use promisery::Promise;
let p = Promise::<_, ()>::new(|| Ok(2))
.then(|res| res.map(|v| v * 10))
.then(|res| res.map(|v| v + 5));
assert_eq!(p.wait(), Ok(Ok(25)));- Chaining:
.thenfor full control over result and error.mapfor value transformation.map_errfor error transformation
- Combinators:
Promise::allwaits for all promises (returnsResult<Result<Vec<T>, E>, PromisePanic>)Promise::raceresolves/rejects with the first to finish (returnsResult<Result<T, E>, PromisePanic>)
- Waiting:
.wait()— safe, never panics, returns a double Result.wait_nopanic()— unsafe, panics if the background task panicked.wait_timeout(duration)— wait with a timeout.wait_deadline(instant)— wait until a deadline
- Panic Handling:
- Panics in promise tasks are detected and reported via
PromisePanic
- Panics in promise tasks are detected and reported via
- Lightweight, no async runtime required
- Familiar API for those coming from JavaScript
- Integrates with Rust's
Result-based error handling - Does not spawn a new thread for each action that produces a new promise (see the documentation for each method for more details)
MIT OR Apache-2.0
See docs.rs/promisery for full documentation, API details, and more examples, including usage of wait_nopanic, wait_timeout, and wait_deadline.