-
-
Save sjy/6a61ae2c814121892bc0feccd87cd49d to your computer and use it in GitHub Desktop.
Polling in JS with an async ajax call that returns a promise ( modified from: https://davidwalsh.name/javascript-polling )
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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! | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment