【问题标题】:JavaScript: How to make a promise that never resolves or rejectsJavaScript:如何做出永远不会解决或拒绝的承诺
【发布时间】:2022-01-25 18:36:01
【问题描述】:

我正在使用:

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

逻辑是如果promise1 在 5 秒内没有解决/拒绝,那么promise2 可能能够解决。所以在延迟promise2 尝试做它的事情之后,如果它失败了,我希望promise2 返回一个永远不会解决的Promise,这样就可以等待promise1

我试过了

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

return new Promise( () => {} ) 似乎被解释为被拒绝而不是从未解决的承诺。

如何做出空头承诺(不是在现实生活中,在 JavaScript 中)?

【问题讨论】:

  • 如果达到超时,让promise1 拒绝并用try/catch 结束并在调用catch 子句时回退到promise 不是更容易吗?
  • 那么行为是不同的,因为如果 promise2 不起作用,我希望给 promise1 时间继续。 promise1 是一个 fetch,如果 promise 2 没有缓存命中则让它花费更长的时间
  • promise1 是一个 fetch,如果 promise 2 没有缓存命中则让它花费更长的时间 promise2 是否意味着 promise1 结果的“缓存”?在这种情况下,链接应该解决它:从promise2开始,如果失败则继续promise1。更好的是:通过将缓存移动到 promise1 本身来使缓存透明。

标签: javascript promise


【解决方案1】:

直接回答你的问题new Promise( () => {} ) 永远不会解决。

这是教授:

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');

但我猜你有不同的问题。

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.

为此,您可以在 promise2promise1 中解决,因为 Promise 是可链接的。

(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');
})()

【讨论】:

  • 吉普车真是太棒了。我永远不会那样做。我花了一段时间才弄清楚。谢谢!
  • 酷,这里的答案涵盖了您所要求的内容,另一个补充是在race() 调用以防promise1 在超时之前失败,在那种情况下,因为我把它列出来,promise2 无济于事。最好先检查缓存,然后再进行提取,但这取决于您的要求。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2016-05-06
  • 2023-03-26
  • 2019-11-29
  • 2021-11-04
  • 2016-03-21
  • 1970-01-01
  • 2019-08-06
相关资源
最近更新 更多