Javascript async: Difference between revisions
Line 1: | Line 1: | ||
=Introduction= | =Introduction= | ||
= | =Typical Problem= | ||
==Typical Failing Code== | |||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
export function raceCondition() { | export function raceCondition() { | ||
Line 32: | Line 32: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
This may fail because it finishes the second request before the first. I.E. we did not wait for the first request before using the second request. | This may fail because it finishes the second request before the first. I.E. we did not wait for the first request before using the second request. | ||
==Callback Pyramid Of Doom== | |||
Moving Second Request to after First Request solves the problem but this know as '''Callback Pyramid Of Doom''' as each request will indent on the previous request | Moving Second Request to after First Request solves the problem but this know as '''Callback Pyramid Of Doom''' as each request will indent on the previous request | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
Line 64: | Line 64: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | =Promises= | ||
==Introduction== | |||
A Promise is "Object that represents the eventual completion (or failure) of an asyncronous operation, and its resulting value" | A Promise is "Object that represents the eventual completion (or failure) of an asyncronous operation, and its resulting value" | ||
A Promise can have three states | A Promise can have three states | ||
Line 72: | Line 73: | ||
(Settled/Resolved means either Fulfilled or Rejected)<br> | (Settled/Resolved means either Fulfilled or Rejected)<br> | ||
'''Note''' Promises are not lazy, i.e. not like yield in c# they execute immediately. | '''Note''' Promises are not lazy, i.e. not like yield in c# they execute immediately. | ||
==Standard try catch Promise== | |||
This is how to catch a standard promise | This is how to catch a standard promise | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
Line 86: | Line 87: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Chaining Promises== | |||
Below is an example of chaining Promises. You can catch errors within the code but you would have to make sure you are throwing the appropriate arguments for the next then. | Below is an example of chaining Promises. You can catch errors within the code but you would have to make sure you are throwing the appropriate arguments for the next then. | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> |
Revision as of 05:36, 13 August 2020
Introduction
Typical Problem
Typical Failing Code
export function raceCondition() {
let xhr = new XMLHttpRequest();
let statuses = [];
xhr.open("GET", "http://localhost:3000/ordersStatuses");
// Success
xhr.onload = () => {
statuses = JSON.parse(xhr.responseText);
};
let xhr2 = new XMLHttpRequest();
xhr2.open("GET", "http://localhost:3000/orders/1");
// Success
xhr2.onload = () => {
const order = JSON.parse(xhr2.responseText);
const description = status.map((t) => {
if (t.id === order.orderStatusId) {
return t.description;
}
})[0];
setText("Order Status: ${description}");
};
xhr2.send();
}
This may fail because it finishes the second request before the first. I.E. we did not wait for the first request before using the second request.
Callback Pyramid Of Doom
Moving Second Request to after First Request solves the problem but this know as Callback Pyramid Of Doom as each request will indent on the previous request
export function raceCondition() {
let xhr = new XMLHttpRequest();
let statuses = [];
xhr.open("GET", "http://localhost:3000/ordersStatuses");
// Success
xhr.onload = () => {
statuses = JSON.parse(xhr.responseText);
let xhr2 = new XMLHttpRequest();
xhr2.open("GET", "http://localhost:3000/orders/1");
// Success
xhr2.onload = () => {
const order = JSON.parse(xhr2.responseText);
const description = status.map((t) => {
if (t.id === order.orderStatusId) {
return t.description;
}
})[0];
setText("Order Status: ${description}");
};
xhr2.send();
};
}
Promises
Introduction
A Promise is "Object that represents the eventual completion (or failure) of an asyncronous operation, and its resulting value" A Promise can have three states
- Pending
- Fulfilled
- Rejected
(Settled/Resolved means either Fulfilled or Rejected)
Note Promises are not lazy, i.e. not like yield in c# they execute immediately.
Standard try catch Promise
This is how to catch a standard promise
export function getCatch() {
axios
.get("http://localhost:3000/orders/11")
.then(({ data }) => {
setText(JSON.stringify(data));
})
.catch((err) => {
setText(err);
});
}
Chaining Promises
Below is an example of chaining Promises. You can catch errors within the code but you would have to make sure you are throwing the appropriate arguments for the next then.
export function chainCatch() {
axios
.get("http://localhost:3000/orders/1")
.then(({ data }) => {
return axios.get(
`http://localhost:3000/addresses/${data.shippingAddress}`
);
})
.then(({ data }) => {
setText(data.my.city);
})
.catch((err) => {
setText(err);
});
}