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 | |
// ... | |
}) |
This comment has been minimized.
This comment has been minimized.
Found out that it works more reliable in Firefox if you're using
|
This comment has been minimized.
This comment has been minimized.
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);
} |
This comment has been minimized.
This comment has been minimized.
This is great, but can't seem to get it to work in IE Edge! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
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