An easy way to run reliable polling without messing with setTimeout.
Here is an article explaining why using setInterval
is discouraged, especially when dealing with asynchronous tasks.
With bower:
bower install async-polling
Then include the script:
<script src="bower_components/async-polling/dist/async-polling.min.js"></script>
<script>
// Here you can use the AsyncPolling constructor.
</script>
With npm:
npm install async-polling
Then require the module:
var AsyncPolling = require('async-polling');
Here is the basic usage:
AsyncPolling(function (end) {
// Do whatever you want.
// Then notify the polling when your job is done:
end();
// This will schedule the next call.
}, 3000).run();
You can also send a result to the end
callback with the usual signature (error, result)
. Pass null
as first argument when everythin is fine:
var polling = AsyncPolling(function (end) {
someAsynchroneProcess(function (error, response) {
if (error) {
// Notify the error:
end(error)
return;
}
// Do something with the result.
// Then send it to the listeners:
end(null, result);
});
}, 3000);
polling.on('error', function (error) {
// The polling encountered an error, handle it here.
});
polling.on('result', function (result) {
// The polling yielded some result, process it here.
});
polling.run(); // Let's start polling.
See also the demo script.
var polling = AsyncPolling(pollingFunc, delay);
pollingFunc(end)
: [function
] The function to run periodically; takes a callback as parameter to notify the end of the process and possibly send a result. It will be bound to the polling object.delay
: [number
(ms)|object
] the delay between two calls ofpollingFunc
. If the type is notnumber
, the.valueOf()
method of the object will be called to retrieve the amount of milliseconds.
polling.run();
polling.stop();
Since the polling function is bound to polling
, one can call this.stop()
from within the polling function:
AsyncPolling(function (end) {
// Do some stuff
// Here I want to stop the polling:
this.stop();
end();
}, 3000).run();
polling.on(eventName, listener);
eventName
: The name of the event for which we register (run
,start
,error
,result
,end
,schedule
,stop
).listener
: The function to call when the specified event occurs.