&gt; This means we never know where a function is being called from.<p>Not really. Chrome dev tools has an &quot;async&quot; option which allows the stack trace to follow through async calls. You will see the async caller instead of the async execution mechanism in the stack. Further, you can black-box frameworks so you only see your code.<p>&gt; The danger I see with promises is they can be used incorrectly.<p>The real danger of promises is the different implementations that existed beforehand. For instance, jQuery promises weren&#x27;t standards-compliant. Their implementation of `then` (which came from `pipe`) wasn&#x27;t the same as the native one. Getting used to one, you&#x27;ll easily write wrong code for the other.<p>&gt; generators will provide more fine-grained control.<p>Depends. It&#x27;s a foreign concept in JS, making it harder to follow as opposed to promises which are nothing more than stateful objects. Also, one&#x27;s mental model will change with generators. One has to look out for that tiny `*` to know the code is &quot;generator friendly&quot;.