【问题标题】:How to throw an error if a promise isn't resolved after a certain time如果在一段时间后没有解决承诺,如何抛出错误
【发布时间】:2018-01-12 08:09:48
【问题描述】:

我只想在承诺尚未解决的情况下在一定时间后抛出错误。类似的东西

promiseDelayReject(delay){ //set timeout omitted
     var t = (return value of $.ajax)
     if(timeUp)
          throw errorAndRejectPromise;
     else
          keepGoingAndResolvePromise

一些想法?

【问题讨论】:

    标签: jquery ajax promise settimeout


    【解决方案1】:

    您可以简单地从Promise 中的setTimeout 调用reject 参数。如果您想做的任何事情都已完成,请使用 clearTimeout() 取消您的超时

    var t;
    var p = new Promise(function(resolve, reject){
      
      t = setTimeout(function(){
        reject('Too late !');
      },5000);
    
      // ... Do your second promise here
      var p2 = new Promise(function(res,rej){
        //If you thing is done, then cancel the timeout :
        //if(...){
        //  clearTimeout(t);
        //  res();
        //}
      });
      
    }).catch(function(error){
      console.log(error);
    });

    【讨论】:

    • 没关系,但不是绝对正确,我需要一个在另一个承诺中的承诺,超时将在外部承诺上,我必须检查内部承诺是否已解决
    • 伙计,正如我之前所说,使用计时器承诺并使用 Promise.race() 和我最初的承诺,这是一种更清洁的方式来做我需要做的事情,无论如何谢谢老兄!
    【解决方案2】:

    好的,所以我们需要能够判断承诺是否首先得到解决,这在原生 Promise API 中不存在,但我们可以通过以下方式来做到这一点:

    //unfortunately the native Promise API
    //doesnt have an isResolved() | isAccepted() | isRejected() method
    //so we have to monkey our way around it
    function isResolved(promise) {
      var resolved = true
    
      promise.then(function(){ resolved = false })
             .catch(function(){ resolved = false })
    
      return resolved
    }
    

    然后你可以在你的setTimeout 中使用它来投掷:

    setTimeout(function(){
      try {
        if(!isResolved(prommise)) throw "stuff"
      } catch(e) {
        //do what you wanted here
      }
    }, delay)
    

    尽管注意try catch 必须在setTimeout 内,因为你不能扔到它接收的函数之外。如果你可以使用回调或承诺链来处理你想抛出的错误会更好

    【讨论】:

    • 感谢您的回答,但我不希望我的承诺在超时后得到解决,我需要我的承诺继续进行,在超时后,如果我的承诺仍在处理中,我想要抛出异常
    • @JSelser 为什么要等待超时结束来检查承诺是否完成?当你的承诺被解决时,只需取消你的超时,它就会摆脱所有这些脏代码。
    • @JSelser 还是不太对劲,我不希望我的代码卡在那里,我希望它一直运行直到发生某些事情
    • @TheRev 我很想修复它,它卡在哪里了?
    • @JSelser 它卡在了 setTimeout 中,超时应该像在 Promise 中一样,我找到了使用 2 个 Promise 的更好方法,我的 Promise 和一个与 Promise.race 一起启动的“计时器 Promise”( ) 还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多