Right, just to add onto MTN’s answer.
The best explanation I’ve heard is talking about “now” and “later”. JS deals with things that are happening “now” and does not naturally wait for anything. (This is different than many other languages.)
One way to handle this is with a callback function. You probably learned this originally. The promise is an attempt for a cleaner solution. Later you will learn about async/await, which is an attempt to make promises prettier. To some extent, things like generator functions can be used for async too (like in Redux Sagas).
When should you use them? When the data isn’t being returned “now”. That is an oversimplification, but that is the basic idea.