There are currently no frequently asked questions associated with this exercise – that’s where you come in! You can contribute to this section by offering your own questions, answers, or clarifications on this exercise. Ask or answer a question by clicking reply () below.
If you’ve had an “aha” moment about the concepts, formatting, syntax, or anything else with this exercise, consider sharing those insights! Teaching others and answering their questions is one of the best ways to learn and stay sharp.
Join the Discussion. Help a fellow learner on their journey.
Ask or answer a question about this exercise by clicking reply () below!
You can also find further discussion and get answers to your questions over in Language Help.
Agree with a comment or answer? Like () to up-vote the contribution!
I think you’re right, it should be console.log(The ${trail.nickname} is ${trail.miles} miles long!) since the mi and nickname variables were only defined in the callback function that we’re trying to replace.
Besides, it’s not possible to pass this checkpoint using the variables.
This lesson somewhat confused me as to how the final code should look like if we make use of the promisify method. Are the initial function declaration getTrailDistance() (written as it is), the callback function and the promisified function suppose to cohabit together on the same file? Since we need to write const getTrailDistancePromise = util.promisify(getTrailDistance), I’m guessing we do need the initial getTrailDistance() to remain unchanged, but if I try to remove the callback function, I obviously get a reference error because we use callback in getTrailDistance() which is not defined anymore.
I assume that the aim is to only have the promisified function in the file and get rid of the old code, but I don’t see how to do that without getting reference errors. And the getTrailDistance() is referring to the callback which becomes obsolete when we decide to convert the callback to a promisified function, so why would we want to keep the code inside getTrailDistance() as it is?
I figured it out!!!
The instructions were not clear at all.
I had to refer to my notes on Promises from the Intermediate Javascript course.
Basically, the key thing to understand is that nickname and mi are keys inside of the resolved value of the Promise getTrailDistancePromise (which you created in the exercise). Also, mi isn’t really the key, it’s actually called miles.
In order to access this data (the resolved value of the Promise), you have to pass it in to the .then() as a function. This is in the form of .then((resolvedValue) => console.log(resolvedValue));. If you run that line of code, it will print out for you the full data. From there, you can construct the console.log() statement the exercise is asking you to.
This is the correct answer below. Note that you can rename x using any variable name. It basically refers to the resolved value of the promise, and simply passes it along to the success handler function nested inside of .then(). (This is explained in the Intermediate Javascript course).
getTrailDistancePromise('North Country').then((x) => console.log(`The ${x.nickname} is ${x.miles} miles long!`)).catch();
I do not understand how to create a new post, so I put my question as a reply… could somebody explain me which is the advantage of promisify the function? It was working without it. It seems just that we are adding extra useless lines of code. I am super lost with this promise thingy :S
I have just completed this exercise too, and while I understand how the promisfy simplifies the code I cannot figure out how to get it to work by removing the old callback() function. I can remove the function completely, but if I then go to remove the callback(null, foundTrail) or and transform the callback(new Error(‘Trail not found!’)) from the getTrailDistance function the program does not output anything (but also does not display any error messages).
Fairly poorly written excercise considering how much of a mental effort understanding promises vs call back functions can be.
Any moderators / codecademy staff able to clarify here how we can remove the redundant callback function so it is just the promisfy?
I struggled with this exercise, and the hint for step 4, “Use the example in the narrative if you’re unsure about the syntax.” is not any help since the narrative example doesn’t involve using an object as the argument for the .then. Explaining that in the hint would be a lot more useful versus looking at the solution. I’m curious whether this is the best place to make this comment or whether it should be addressed as a bug? Also curious whether Codecademy responds to this type of comment here or in bug reports?
It’s a poor excercise imo (well step 4 specifically). Surely better practice would be to encourage re-writing the initial functions to incorporate modern promise syntax (async/await) or (new Promise resolve/reject). Feel i’ve wasted my time on this because it doesn’t appear to save on any code reduction either
Hi, i don’t understand the use of “if (trails.hasOwnProperty(trail))” line 8 because when i look into the trails.js files there is no property called trail, and without .hasOwnProperty(trail) the function is still good
I completed this example but then also attempted to call this getTrailDistancePromise (promisified function) using await but I get the message that await is only valid in async functions. Doesn’t promisify make an asynchronous function?
I’m confused as to why this does not work.
try {
let trail = await getTrailDistancePromise(‘North Country’);
console.log(Thee ${trail.nickname} is ${trail.miles} miles long!);
} catch (error) {
console.error(Error, error);
}
The confusion that arises from this exercise is the lack of explanation about why to use promisify in the first place. Lots of the posts on here suggest ‘replace’. None of the original code is being replaced, that is not the purpose of Promsisify. Its purpose is to add an extra layer.
Here’s a real world example.
You might want to use a function that exisits in the ‘fs’ library called ‘fs.readFile’. Some light research reveals that fs.readFile uses an error-first callback. We can use Promisify to convert fs.readFile for our own purposes into a promise. The three key advantages are: -
Easier to understand code;
Ability to use await with callback-based APIs;
Avoiding nesting issues.
I too struggled with this but 20 minutes of web-search and a Copilot search on
You can view that object by opening the trails.js file from the navigator.
I’d like to see this file, but don’t know what “navigator” has it. I don’t see it anywhere. A little help would be nice. I’m using Brave Browser in Linux Mint.
I did not understand the way promisify works from the lesson. After asking chatGPT now I think I may understand better.
When util.promisify is applied to getTrailDistance, it wraps the original function in a new function that returns a promise. Internally, this promise will:
Resolve: If the callback is called with null as the first argument (indicating no error), the promise resolves with the second argument (the trail distance).
Reject: If the callback is called with an error object as the first argument, the promise rejects with that error.
This transformation allows you to work with getTrailDistance as a promise-based function, making your code cleaner and more manageable, especially when dealing with multiple asynchronous operations.