This question often comes up when discussing Promises or the Event Loop. In short, there is no difference from a technical standpoint. You could say that async/await is syntactic sugar on top of chaining that lets you write asynchronous code in a synchronous style, as is common in most programming languages, for example C#.
Choosing between chaining and async/await is a matter of taste, but in practice the synchronous style is much easier to read, and most developers usually go with async/await.
Let's look at an example
// Використання chaining
fetchData()
.then(result => console.log(result))
.catch(error => console.error(error));
// Той самий код, але в async/await стилі
async function run() {
try {
const result = await fetchData();
console.log(final);
} catch (error) {
console.error(error);
}
}