- Overview
- Transcript
10.2 Promise Chaining
In this lesson we continue looking at promises, this time focusing on handling multiple asynchronous tasks with promise chaining.
1.Introduction2 lessons, 07:42
1.1Introduction02:12
1.2Setup05:30
2.Language Fundamentals8 lessons, 1:00:53
2.1Variables06:33
2.2Data Types11:28
2.3Arithmetic, Assignment, and Comparison Operators10:24
2.4Unary, Logical, Comma, and Spread Operators09:02
2.5Operator Precedence03:50
2.6Reserved Words04:17
2.7Strict Mode04:34
2.8Functions10:45
3.Data Structures5 lessons, 22:52
3.1Arrays04:29
3.2Objects04:30
3.3Sets04:57
3.4Maps04:21
3.5Weak Maps and Weak Sets04:35
4.Controlling Program Execution7 lessons, 37:06
4.1Conditionals07:49
4.2Switch Statements04:41
4.3The For Loop06:39
4.4The `for .. in` Loop05:17
4.5The `for .. of` Loop04:02
4.6Iterators05:03
4.7While Loops03:35
5.Using JavaScript13 lessons, 1:44:36
5.1Working With Strings09:32
5.2Template Literals05:46
5.3Working With Numbers06:57
5.4Working With Arrays12:53
5.5Iterating and Transforming Arrays07:33
5.6Working With the Object Type13:55
5.7Object Literal Extensions06:45
5.8Working With Object Instances06:45
5.9Getters and Setters05:00
5.10Custom Objects11:28
5.11The `Math` API04:54
5.12Working With Dates and Times08:10
5.13The `Array` Constructor04:58
6.Functions8 lessons, 56:07
6.1The `this` Object06:15
6.2Working With Functions10:11
6.3Scope07:37
6.4Arrow Functions06:59
6.5Generator Functions08:13
6.6Closures05:00
6.7Prototypes06:26
6.8Default and Rest Parameters05:26
7.Miscellaneous6 lessons, 52:39
7.1Destructuring Assignments08:09
7.2AJAX08:30
7.3Regular Expressions10:51
7.4More About Regular Expressions08:38
7.5Classes06:48
7.6ES Modules09:43
8.Working With the DOM6 lessons, 37:39
8.1Selecting HTML Elements05:02
8.2Manipulating HTML Elements07:40
8.3DOM Traversal05:25
8.4Adding and Removing Elements04:45
8.5Creating Elements and Other Nodes04:39
8.6DOM Events10:08
9.Web APIs4 lessons, 17:41
9.1The Selector API03:03
9.2Geolocation05:29
9.3Web Storage05:24
9.4Web Workers03:45
10.Asynchronous JavaScript5 lessons, 26:23
10.1Promises09:52
10.2Promise Chaining05:11
10.3The async Keyword03:21
10.4The await Keyword04:04
10.5More About async and await03:55
11.Conclusion1 lesson, 00:43
11.1Conclusion00:43
10.2 Promise Chaining
Hi, folks. In this lesson, we're going to look at promise chaining, which is a useful way of handling a sequence of asynchronous actions while keeping our code nicely readable. In the last lesson, we finished up by creating a function that makes an Ajax request to the numbers API. Let's extend that example so that we make another request using the number returned by the numbers API. Starting with the code as we left it in the last lesson, the success handler logs the response from the numbers API to the console. Instead, let's take up to the first three numbers from the returned number fact, which always starts with a number, and pass this number to a different API. First of all, let's just update the name of the getNumberFact function so that it's a bit more generic. Let's change the name of the function to getApiResponse. Great. Now before we actually look at promise chaining, let's just look at the alternative. It might be intuitive to make a new request actually inside the success handler of the first then. Like this. This time, we can get the number at the start of the number fact returned from the numbers API using the match string method on the response. This returns an array, and the number will be the first item in that array. We can then trim that down to up to the first three digits of the number, just in case the numbers API returns a ridiculously big number, which it occasionally does. We then invoke the get API response method once more, this time passing a different URL, which in this case is a Game of Thrones character API. So this should work, and we should see the response from the second API in the browser's console. Let's just take a look. And we can see the character data there returned from the Game of Thrones character API. The problem with this code, unfortunately, is that the response handler for the second request is indented. The code is moving towards the right of this screen, in the classic pyramid of doom. If we wanted to make even more additional requests, our code could end up starting halfway across the page, making it much less readable. Promise chaining can fix this for us. Instead of handling the response in the first success handler, we can just return the value that we want to make use of in the chained promise. Let's change the first success handler like this. This is a condensed version of the previous code, but know that instead of making the second request inside the success handler, we are just returning the number, which will still be up to the first three digits of the numbers API number. The then method itself returns a promise. So we can chain another then method after the first one, which will receive the success value from the first promise. The success handler for this then method will receive the number returned by the previous method, so we can use this to make the second request. As this is an arrow function, it will return the return value of the get API request function, which will be another promise. To handle the response from the second request, we can chain another then method after the second one. In the success handler for this then method, we should receive the Game of Thrones character data, which we can just log to the console. This should work in exactly the same way as the previous example, but notice that our code isn't moving to the right at all, it's all staying neat and readable. This is the benefit of promise chaining. Let's just check that everything is still working in the browser. And we can see the Game of Thrones character data there in the console, as expected. We can also tidy this code up further. Notice how we're duplicating the error handler in each method of the chain? Well, instead of doing that, we can just chain a catch method onto the end of the chain. This will now catch any error in any of the previous chained then methods, so we can remove the separate error handlers from the previous methods, making our code even shorter. With nested then methods, this kind of error handling is not possible. So in this lesson, we looked at promise chaining, and saw that the then method itself returns a promise, allowing us to chain the then method multiple times in order to handle multiple requests without resorting to unsightly excessive nesting. We also learned that this gives us improved error handling, allow us to catch an error in the chain using a single error handler with the catch method. In the next lesson, we will look at async functions. Thanks for watching.