One of the tough things about learning Javascript is promises
. They are not easy to understand and may take some guidance and a fair amount of time to use them. Today we will prepare for coding interview
and understand them through the following code
Try processing questions first, then we will see the answers.
1. What are the results?
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">const</span> firstPromise <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">res <span class="token punctuation">,</span> rej</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> res <span class="token punctuation">,</span> <span class="token number">500</span> <span class="token punctuation">,</span> <span class="token string">'one'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> secondPromise <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">res <span class="token punctuation">,</span> rej</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> res <span class="token punctuation">,</span> <span class="token number">100</span> <span class="token punctuation">,</span> <span class="token string">'two'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> Promise <span class="token punctuation">.</span> <span class="token function">race</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> firstPromise <span class="token punctuation">,</span> secondPromise <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token operator">=></span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> res <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- A: “one”
- B: “two”
- C:
"two"
"one"
- D:
"one"
"two"
Explain
- When we execute multiple
promises
with thePromise.race
method, it resolves / rejects thepromise
complete at the earliest. WithfirstPromise
takes 500ms to return andsecondPromise
takes 100ms. SosecondPromise
beresolve
before value log out"two"
. So the correct answer is B
2. What will the code print out?
1 2 3 4 5 6 7 | <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">getData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">await</span> Promise <span class="token punctuation">.</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">'I made it!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token function">getData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- A:
"I made it!"
- B:
Promise {<resolved>: "I made it!"}
- C:
Promise {<pending>}
- D:
undefined
Explain
- An async function always returns a
promise
.await
will keep waiting until the promise completes. Thatpromise
will be pending while it’s doinggetData()
untilresolve/reject
. - So if we want to get the data value
"I made it!"
We can use the.then()
:
1 2 | data <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token operator">=></span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> res <span class="token punctuation">)</span> <span class="token punctuation">)</span> |
With the above code will not log out "I made it!"
. The answer is C
3. What is the output value?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">const</span> <span class="token function-variable function">myPromise</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> Promise <span class="token punctuation">.</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">'I have resolved!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">firstFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">myPromise</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">res</span> <span class="token operator">=></span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> res <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'second'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">secondFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token keyword">await</span> <span class="token function">myPromise</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'second'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">firstFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">secondFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- A:
I have resolved!
,second
andI have resolved!
,second
- B:
second
,I have resolved!
andsecond
,I have resolved!
- C:
I have resolved!
,second
andsecond
,I have resolved!
- D:
second
,I have resolved!
andI have resolved!
,second
Explain
- With a regular promise and function we’ll basically understand that I want to execute this function, but I’ll put them aside while it’s running as this can take some time. Only if a value that is
resolve
(orreject
) or thecallstack
is empty do I use them - We can get data with both
.then
andawait
in anasync function
likefirstFunction
andsecondFunction
. However, they will be different. - With
firstFunction
we will push themyPromise
function aside (and callstack) while they’re running, and continue executing all the code below, in this caseconsole.log('second')
. Then go back to executing them when thecallstack
is empty. - For
secondFunction
we will pause execution of the code below until the value has been processed and then run the next code. This will ensure consistent processing of our code. SoI have resolved
log, then ran tosecond
=> D
4. Which result is returned below?
1 2 | Promise <span class="token punctuation">.</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- A:
5
- B:
Promise {<pending>: 5}
- C:
Promse {<fulfilled>: 5}
- D:
Error
Explain
When we execute the command that returns any type of value with Promise.resolve
, whether promise
or non-promise
. Then this method will return to a promise
with the resolved value
( <fulfilled>
). That means if we return with Promise.resolve
then the data will be returned with the promise
form. In this case the value returned is a promise
with the data 5
. The answer will be C
5. What is returned?
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token operator">*</span> <span class="token function">range</span> <span class="token punctuation">(</span> <span class="token parameter">start <span class="token punctuation">,</span> end</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> i <span class="token operator">=</span> start <span class="token punctuation">;</span> i <span class="token operator"><=</span> end <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">yield</span> Promise <span class="token punctuation">.</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> i <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">(</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> gen <span class="token operator">=</span> <span class="token function">range</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token keyword">await</span> <span class="token punctuation">(</span> <span class="token keyword">const</span> item <span class="token keyword">of</span> gen <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> item <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
- A:
Promise {1}
Promise {2}
Promise {3}
- B:
Promise {<pending>}
Promise {<pending>}
Promise {<pending>}
- C:
1
2
3
- D:
undefined
undefined
undefined
Explain
Above we use a generator function
with a range
function that returns an async object
with promises
each element traverses: Promise{1}
, Promise{2}
, Promise{3}
. They put on a gen
variable as an async object
. We then loop through it with a for await ... of
loop. Thus, the loop will put on the item with the value of the promise value
: First Promise{1}
, 2 is Promise{2}
and finally Promise{3}
. Since we are waiting for the value of each item
using await
, Thus promises will be resolved and returned in the order of 1
, 2
and 3
. The answer is * C
summary
- Hopefully, the above questions about
promise
will help you refresh your knowledge and review your knowledge. Good luck with Javascript. - Source article here