Coroutines are functions that runs asynchronously. The body of coroutines are generator functions, each time a promise is yielded inside a coroutine it blocks until the promise is resolved or rejected. Each coroutine execution returns a promise that is resolve when the coroutine returns, or rejected if an error occurs.