Say I have a promise called myProm
, and say I have success and error handlers called onSuccess
and onError
.
Whenever my promis
There should be no side effect. It would be a browser bug if a non-referenced Promise
in whatever state is keeping resources.
Just make sure you don't keep any reference to the Promise
object and you'll be fine.
Beware that certain APIs such as setTimeout
will keep a reference to the closure up to the timeout value. This means that if you have a long timeout, like the 10s one, you should clear it as soon as you don't need it anymore. Otherwise your code can call thousands of setTimeout
within 10s, and each of them will keep a reference to the closure, which in your case will reference the Promise
.
You can use Promise.race()
, set timeoutHandler
as a function which returns a rejected a Promise
in ten seconds, else onSuccess
should be called at fulfilled Promise
of myProm
function myProm() {
return new Promise((success, err) => {
setTimeout(() => {
success("myProm")
}, Math.floor(Math.random() * 11000))
})
}
function timeoutHandler() {
return new Promise((_, timeout) => {
setTimeout(() => {
timeout(new Error("timeoutHandler"));
}, 10000)
})
}
function onSuccess(data) {
console.log("success", data)
}
function onError(err) {
console.log("err:", err)
}
function onTimeout(e) {
if (e.message && e.message === "timeoutHandler") {
console.log(e.message + " handled");
}
else {
onError(e)
}
}
Promise.race([myProm(), timeoutHandler()])
.then(onSuccess, onTimeout);
plnkr http://plnkr.co/edit/9UD5syOEOc1oQGdRTRRm?p=preview