Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Polling in JS with an async ajax call that returns a promise ( modified from: https://davidwalsh.name/javascript-polling )
// The polling function
function poll(fn, timeout, interval) {
var endTime = Number(new Date()) + (timeout || 2000);
interval = interval || 100;
var checkCondition = function(resolve, reject) {
var ajax = fn();
// dive into the ajax promise
ajax.then( function(response){
// If the condition is met, we're done!
if(response.data.var == true) {
resolve(response.data.var);
}
// If the condition isn't met but the timeout hasn't elapsed, go again
else if (Number(new Date()) < endTime) {
setTimeout(checkCondition, interval, resolve, reject);
}
// Didn't match and too much time, reject!
else {
reject(new Error('timed out for ' + fn + ': ' + arguments));
}
});
};
return new Promise(checkCondition);
}
// Usage: get something via ajax
poll(function() {
return axios.get('something.json');
}, 2000, 150).then(function() {
// Polling done, now do something else!
}).catch(function() {
// Polling timed out, handle the error!
});
@baj84

This comment has been minimized.

Copy link

commented May 9, 2018

How would you have multiple polls on the same page?

@stormbreakers

This comment has been minimized.

Copy link

commented Dec 7, 2018

we can use Promise.all for multiple polls, follow the below example
Promise.all([poll(function() { return axios.get('something.json'); }, 2000, 150),poll(function() { return axios.get('something2.json'); }, 2000, 150),poll(function() { return axios.get('something3.json'); }, 2000, 150)])

i have not tried this but this should work

@dotjosh

This comment has been minimized.

Copy link

commented Jan 3, 2019

I needed something similar, but didn't need the timeout. Leaving this here for others:

const continuousPromise = (promiseFactory, interval)  => {
    const execute = () => promiseFactory().finally(waitAndExecute);
    const waitAndExecute = () => window.setTimeout(execute, interval);
    execute();
}

//Usage
continuousPromise(() => axios.get("something.json"), 150);
@AndrewJHart

This comment has been minimized.

Copy link

commented Sep 4, 2019

nice usage of promise for polling

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.