Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript: How to make a promise that never resolves or rejects

I am using:

 await Promise.race([promise1, promise2]);

The logic is if promise1 has not resolved/rejected within 5s, then promise2 might be able to resolve. So after a delay promise2 tries to do its thing, if it fails I wish to have promise2 return a Promise that never resolves so that its all up to waiting for promise1.

I tried

async function promise2(timeout=5000) {
    await new Promise(resolve => setTimeout(resolve, timeout));
    if (didStuffAndOK())  {
        return "OK"
    }
    return new Promise( () => {} )
}

return new Promise( () => {} ) seems to be interpreted as the promise being rejected rather than never resolved.

How does one make an empty promise (not in real life, in JavaScript)?

like image 377
run_the_race Avatar asked Dec 04 '25 06:12

run_the_race


1 Answers

To answer straight your question new Promise( () => {} ) never resolves.

Here is the prof :

new Promise(()=>{})
   .then(()=> console.log('promise resolved'))
   .catch(()=>console.log('promise rejected'));
console.log('FOO, so that you can see that the code was executed');

But I guess you have a diffrent question.

The logic is if promise1 has not resolved/rejected within 5s, then promise2 
might be able to resolve. So after a delay promise2 tries to do its thing, if it 
fails I wish to have promise2 return a Promise that never resolves so that its 
all up to waiting for promise1.

For this you can resolve in the promise2 the promise1, because promises are chainable.

(async ()=>{

  const promise1 = new Promise(()=>{}) // simulating here a very long fetch;
  
  const promise2 = new Promise((res)=>{
    
    setTimeout(()=>{
        try {
          console.log('one second passed and the fetch is still running');
          throw Error() // simulating a promise2 does it thing and fails
        } catch (e){
          res(promise1); // Chain promise1 back
        }
     }, 1000);
   });  
   await Promise.race([promise1, promise2]);
   console.log('This won\'t be printed because the previous line awaits for promise1');
})()
like image 138
Tiberiu C. Avatar answered Dec 06 '25 18:12

Tiberiu C.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!