Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Preview
Start a free Courses trial
to watch this video
Learn a new, easier way to make network requests with the Fetch API.
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
ES2015 introduced a more elegant and
friendlier data fetching interface
0:00
that's native to the browser
called the fetch API.
0:04
Fetch uses JavaScript
promises to let you handle
0:07
the results returned from the server.
0:10
In this video, I'll teach you a new
way to network requests with fetch.
0:13
You'll learn how it makes
requesting resources easier.
0:17
Now, I'm not gonna go to deep into the
fetch API in this course because we have
0:20
content here at Treehouse dedicated
to working with the fetch API.
0:24
So be sure to refer to the teacher's notes
to learn a whole lot more about fetch.
0:27
I'm also going to continue
working in the file promises.js.
0:32
If you'd like, you can create a new
file called fetch.js, for example,
0:35
and write the new fetch requests there.
0:39
No matter, what you can always
refer to the project files for
0:41
any of the code written in this course.
0:45
So to make a fetch request,
you use the global fetch method.
0:47
Fetch takes one mandatory argument, the
path to the resource you want to fetch.
0:51
In our eventListener,
I'll start by replacing the call to
0:56
the getJSON function to fetch,
passing it the same URL.
1:01
Now, here's the best part.
1:05
We can actually get rid of the getJSON
function entirely because this
1:07
single fetch method is going to
handle most of these tasks for us.
1:11
The fetch method itself returns a promise,
and once fetch makes the request and
1:21
the data finishes loading,
the fetch promise is fulfilled.
1:26
It's also going to return a response
object containing information about
1:30
the response like the status code and
the corresponding status message.
1:34
In order to access and use the data,
we need to parse it to JSON first.
1:38
So I'll chain a new then
method to fetch and
1:42
pass it a function that accepts
the response via a parameter
1:46
I'll name response and
parses it to JSON with response.json.
1:51
Response.json is going
to read the response and
1:58
returns a promise that resolves to JSON.
2:02
And that's going to get passed
on to getProfiles once resolved.
2:05
Next, the getProfiles
function is also making
2:09
a request to the Wikipedia API
via getJSON.
2:13
So let's change it to use fetch.
2:17
And just like earlier we need
to pass the return data to JSON
2:20
by chaining a then method to fetch and
2:25
passing it a function that accepts
the response and parses it to JSON.
2:29
And that's all there is to it.
2:39
Promise.all is going to
work exactly as before,
2:40
it's going to wait on all of
the individual fetch requests.
2:43
Then join them into one return value when
all the fetch promises are fulfilled.
2:47
Let's test our code.
2:52
I'll refresh the page,
click the button, and
2:53
everything works just like before, good.
2:56
It's usually best to handle errors and
fetch requests or
3:02
any promise sequence as high
up in the chain as possible.
3:05
For example,
3:08
you could handle an error in the Wikipedia
fetch separately by chaining a catch
3:09
method to the fetch sequence that's
higher up in the getProfiles function.
3:14
I'll pass catch a function that takes
the rejection reason as a parameter and
3:19
logs it to the console.
3:25
Just before the error, I'll display
the message Error Fetching Wicki.
3:27
So now, if there's ever an issue
fetching the Wikipedia data,
3:35
we'll know exactly where it's happening.
3:39
And this is what I meant earlier when
I mentioned that promises provide
3:42
an easier ways to catch
errors in your program.
3:45
Finally, I want to display one other piece
of data to the user, the spacecraft each
3:50
astronaut is on, which is almost always
the ISS or International Space Station.
3:55
The data is available in
the first API call we make to open
4:00
notify under a property named craft.
4:05
So in the getProfiles function
method I'll pull that data out and
4:08
save it in a variable named craft,
with const craft equals person.craft.
4:13
Next I'll need to combine data returned
from two APIs into one object,
4:19
the craft data with
the astronaut profiles data.
4:24
So I'll chain one more then
method to this fetch sequence.
4:27
I'll pass the method a function that
takes the profile data in JSON via
4:33
parameter I'll call profile and
returns an object.
4:37
Inside the object,
I'll use the spread operator to copy all
4:44
the properties from a profile
object on to this new object.
4:49
And in this object,
I'll include the craft property and
4:53
value using the variable craft.
4:57
Finally, in the generateHTML function,
4:59
we'll display the craft data as a span
element just below the profile image.
5:02
Then interpolate the value of
the craft property with ${},
5:11
passing it person.craft.
5:16
Now over in the browser, I'll refresh.
5:21
Click View and good,
5:23
we see each astronaut profile which
includes the spacecraft they're on.
5:25
While promises seem like a clear
improvement over callbacks,
5:36
mainly because they increase
the readability of async code,
5:40
they still do not entirely get rid of
callback functions in your program.
5:43
And that's okay because your code will
likely use callbacks in some way.
5:47
It's the deep nesting that
could cause problems.
5:50
In addition, your promise based program
may require lots of then methods,
5:53
with anonymous functions or function
references to handle each different task.
5:57
That can make your code somewhat confusing
and there's a chance that you still
6:02
may end up writing code that resembles
the pyramid of doom style structure.
6:06
So up next, you'll learn how the async
await syntax in JavaScript further
6:09
simplifies the process of working with
promises, providing ways to make your
6:13
asynchronous code look and behave
a little more like synchronous code.
6:17
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up