Skip to content

Instantly share code, notes, and snippets.

@adamwathan
Last active February 26, 2023 14:25
Show Gist options
  • Star 81 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save adamwathan/babd10ed0e971404c5d8a86358d01b61 to your computer and use it in GitHub Desktop.
Save adamwathan/babd10ed0e971404c5d8a86358d01b61 to your computer and use it in GitHub Desktop.
Promise.takeAtLeast
// Creates a new promise that automatically resolves after some timeout:
Promise.delay = function (time) {
return new Promise((resolve, reject) => {
setTimeout(resolve, time)
})
}
// Throttle this promise to resolve no faster than the specified time:
Promise.prototype.takeAtLeast = function (time) {
return new Promise((resolve, reject) => {
Promise.all([this, Promise.delay(time)]).then(([result]) => {
resolve(result)
}, reject)
})
}
// Make sure this doesn't resolve for at least 300ms, useful for things like
// keeping a loading spinner on screen just long enough to not look janky:
axios.post(`/published-products`, payload)
.takeAtLeast(300)
.then(response => {
this.loading = false
// ...
})
.catch(response => {
this.loading = false
// ...
})
@mavame
Copy link

mavame commented Aug 28, 2017

I wrote something similar. In my case I needed to wait no more than a certain amount of time for my async task to run. And if it hadn't finished in a set amount of time, reject the promise.
https://gist.github.com/mavame/adbad3a22cdcaaff314ab8fafd8efaba

@skollro
Copy link

skollro commented Feb 6, 2018

Found out that it works more reliable in Firefox if you're using

window.Promise = Promise
window.Promise.prototype.takeAtLeast = ...

@treetrum
Copy link

treetrum commented Sep 9, 2019

You should be able to simplify the takeAtLeast proto function by not creating an additional promise around Promise.all. See below:

Promise.prototype.takeAtLeast = function(time) {
    return Promise.all([this, Promise.delay(time)]).then(([result]) => result);
}

@engram-design
Copy link

This is great, but can't seem to get it to work in IE Edge! "Object doesn't support property or method 'takeAtLeast'" @adamwathan

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment