- can't trace uncaught rejections back to the calling code
- dependency hell, immature dependencies, forks on forks
- inconsistent use of promises, e.g. mongoose you need to remember
.exec
and it doesn't throw but returns null - debugging is rough, end up console logging most of the time
- promises are confusing, you can avoid them for a while with async/await or co but eventually they will bite you
- easy concurrency