What Async Promised and What It Delivered
zdw
51 points
28 comments
April 22, 2026
Related Discussions
Found 5 related stories in 60.4ms across 5,335 title embeddings via pgvector HNSW
- Async Programming Is Just Inject Time marvinborner · 36 pts · March 06, 2026 · 48% similar
- You can't cancel a JavaScript promise (except sometimes you can) goodoldneon · 81 pts · April 07, 2026 · 47% similar
- C++26: Reflection, Memory Safety, Contracts, and a New Async Model birdculture · 34 pts · April 19, 2026 · 45% similar
- Prompt-caching – auto-injects Anthropic cache breakpoints (90% token savings) ermis · 68 pts · March 13, 2026 · 42% similar
- ML promises to be profoundly weird pabs3 · 452 pts · April 08, 2026 · 42% similar
Discussion Highlights (8 comments)
cdaringe
Surely by section 7 well be talking (or have talked) about effect systems
andrewstuart
I like async and await. I understand that some devs don’t want to learn async programming. It’s unintuitive and hard to learn. On the other hand I feel like saying “go bloody learn async, it’s awesome and massively rewarding”.
joelwilliamson
Function colouring, deadlocks, silent exception swallowing, &c aren’t introduced by the higher levels, they are present in the earlier techniques too.
paulddraper
> This was bad enough that Node.js eventually changed unhandled rejections from a warning to a process crash, and browsers added unhandledrejection events. A feature designed to improve error handling managed to create an entirely new class of silent failures that didn’t exist with callbacks. Java has this too.
littlestymaar
Because all HN needed was another piece of AI slop incorrectly quoting “what color is your function”… It's 2026 and I'm starting to hate the internet.
nrds
Zig is just doing vtable-based effect programming. This is the way to go for far more than async, but it also needs aggressive compiler optimization to avoid actual runtime dispatch.
wesselbindt
I would really hate to work with a blue/red function system. I would have to label all my functions and get nothing in return. But, labelling my functions with some useful information that I care about, that can tell me interesting things about the function without me having to read the function itself and all the functions that it calls, I'd consider a win. I happen to care about whether my functions do IO or not, so the async label has been nothing short of a blessing.
rstuart4133
Async is a Javascript hack that inexplicably got ported to other languages that didn't need it. The issue arose because Javascript didn't have threads, and processing events from the DOM is naturally event driven. To be fair, it's a rare person who can deal with the concurrency issues threads introduce, but the separate stacks threads provide a huge boon. They allow you to turn event driven code into sequential code. window.on_keydown(foo); // Somewhere far away function foo(char_event) { process_the_character(char_event.key_pressed) }; becomes: while (char = read()) process_the_character(char); The latter is easy to read linear sequence of code that keeps all the concerns in one place, the former rapidly becomes a huge entangled mess of event processing functions. The history of Javascript described in the article is just a series of attempts to replace the horror of event driven code with something that looks like the sequential code found in a normal program. At any step in that sequence, the language could have introduced green threads and the job would have been done. And it would have been done without new syntax and without function colouring. But if you keep refining the original hacks they were using in the early days and don't the somewhat drastic stop of introducing a new concept to solve the problem (separate stacks), you end up where they did - at async and await. Mind you, async and await to create a separate stack of sorts - but it's implemented as a chain objects malloc'ed on the heap instead the much more efficient stack structure. I can see how the javascript community fell into that trap - it's the boiling frog scenario. But Python? Python already had threads - and had the examples of Go and Erlang to show how well then worked compared to async / await. And as for Rust - that's beyond inexplicable. Rust has green threads in the early days and abandoned them in favour of async / await. Granted the original green thread implementation needed a bit of refinement - making every low level choose between event driven and blocking on every invocation was a mistake. Rust now has a green thread implementation that fixes that mistake, which demonstrates it wasn't that hard to do. Yet they didn't do it at the time. It sounds like Zig with its pluggable I/O interface finally got it right - they injected I/O as a dependency injected at compile time. No "coloured" async keywords and compiler monomorphises the right code. Every library using I/O only has to be written once - what a novel concept! It's a pity it didn't happen in Rust.