如果在一定时间后未解决承诺,如何抛出错误

时间:2018-01-12 08:09:49

标签: jquery ajax promise settimeout

如果承诺尚未解决,我想在一定时间后抛出错误。像

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

一些想法?

2 个答案:

答案 0 :(得分:0)

您只需拨打rejectPromise的{​​{1}}参数即可。如果您之前完成了任何操作,请使用setTimeout

取消暂停



clearTimeout()




答案 1 :(得分:0)

好的,所以我们需要能够判断承诺是否先解决,这在本机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内,因为你不能扔到它收到的函数之外。如果你可以使用回调或承诺链来处理你想要抛出的错误

会好得多