Considering that I have the following:
JavaScript
x
4
1
const timeoutPromise = new Promise(resolve => setTimeout(resolve("Failure"), 5000));
2
3
const response = await Promise.race([infinite_task, timeoutPromise]);
4
The infinite_task
is a promise that never resolves or rejects.
I tried to use Promise.race
but it will never compare both promises, since infinite_task
never ends.
How can I force infinite_task
to resolve after a timeout (in this case, after 5 seconds)?
Advertisement
Answer
You have a behavioural error in the setTimeout
function. You are passing the result of the resolve
function (that is undefined
) as parameter of the setTimeout
, when you should pass a callback. This means that your timeoutPromise
actually resolves instantly and not after the real timeout. This behaves as you expect:
JavaScript
1
29
29
1
let infinite_task = new Promise(() => { /* never resolving promise */ });
2
3
const timeoutPromise = new Promise(resolve => {
4
setTimeout(() => { // this is the needed change to the callback
5
resolve("Failure")
6
}, 5000)
7
});
8
9
const response = Promise.race([
10
infinite_task,
11
timeoutPromise
12
])
13
.then(e => console.log('Result:', e));
14
15
// making it a function
16
function awaitFor(promise, millis) {
17
return Promise.race([
18
promise,
19
new Promise((resolve, reject) => {
20
// NOTE: here better to use reject so we can use catch to see if
21
// the promise was fulfilled or timeout was elasped
22
setTimeout(() => reject('timeout'), millis)
23
})
24
]);
25
}
26
27
awaitFor(infinite_task, 10000)
28
.then(() => console.log('infinite task was not so infinite!'))
29
.catch(e => console.log('Error2:', e));
Decomposing your code:
For clarity I decompose in steps what you did:
JavaScript
1
23
23
1
const timeoutPromise = new Promise(resolve => setTimeout(resolve("Failure"), 5000));
2
3
// Promise function dec.
4
const timeoutPromise = new Promise(function(resolve) {
5
setTimeout(resolve("Failure"), 5000)
6
});
7
8
// setTimeout arguments dec.
9
const timeoutPromise = new Promise(resolve => {
10
let timeout = 5000;
11
let callback = resolve("Failure") // this fulfill the promise and returns undefined
12
setTimeout(callback, timeout);
13
});
14
15
// variable-values substitutions
16
const timeoutPromise = new Promise(resolve => {
17
resolve("Failure") // this fulfill the promise and returns undefined
18
setTimeout(undefined, 5000); // this pratically do nothing
19
});
20
21
// contraction (actual code executed, at the end of the day)
22
const timeoutPromise = new Promise(resolve => resolve("Failure"));
23