Basically, async I/O gives you more options than "block the whole world while you go read this stuff", and that means that old idioms aren't effective.
You gain more control: can choose when to block, when to limit concurrency and when to just launch a bunch of tasks at the same time. At the same time, you need to adopt a few new patterns, since you can't/don't feel right blocking execution every time you use an external data source. It's definitely a tradeoff and not a magic bullet.
For my longer take on this, see http://book.mixu.net/ch7.html