# Callbacks and Asynchronous code

JavaScript is a **synchronous**, single threaded programming language. This means that instructions can only run one after another, and not in parallel. Each instruction waits for the previous instruction to complete its execution.

{% code title="snippet.js" %}
```javascript
console.log("step 1");
console.log("step 2");
console.log("step 3");
```
{% endcode %}

{% code title="output" %}
```
step 1
step 2
step 3
```
{% endcode %}

**Asynchronous code** execution allows to execution next instructions immediately and doesn't block the flow because of previous instructions.

{% code title="snippet.js" %}
```javascript
console.log('Step 1');

// Set timeout for 3 seconds
setTimeout(() => console.log('Step 2'), 3000);

console.log('Step 3');
```
{% endcode %}

{% code title="output" %}
```
Step 1
Step 3
Step 2
```
{% endcode %}

#### Simple analogy for synchronous and asynchronous code

**Synchronous Execution**

My boss tells me to write code. I tell him: Fine. I get started and he's watching me like a vulture, standing behind me, off my shoulder. I'm like "Dude, why don't you go and do something while I finish this?"

He says: "No, I'm _waiting right here_ until you finish." This is synchronous.

**Asynchronous Execution**

The boss tells me to do it, and rather than waiting right there for my work, the boss goes off and does other tasks. When I finish my job I simply report to my boss and say: "I'm done!" This is Asynchronous Execution.

#### References

* [https://www.freecodecamp.org/news/synchronous-vs-asynchronous-in-javascript/](https://www.freecodecamp.org/news/synchronous-vs-asynchronous-in-javascript/)
* [https://developer.mozilla.org/en-US/docs/Web/API/setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/setTimeout)
