Determined, and unwavering.
Finally get to retry during a Promise operation (works in modern browsers as well as node.js), zero dependencies.
It includes a very basic but reliable retry mechanism for a Promise operation.
Minimal requirements: 3kb unminified / 0 dependencies.
- Database retry
- API retry
- Anything...
Download resolute.js from , create a new instance as shown below and optionally provide a callback that is executed every retry, which gives you the current retry count.
var Resolute = require("./resolute");
var somePromiseOperation = function() {
return new Promise(function(resolve, reject) {
// Make it fail...
if (err) return reject(err);
resolve("success");
});
};
var resolute_options = {
// Reference to your Promise function, note: this Promise will always fail.
operation: somePromiseOperation,
// Maximum number of times to attempt
maxRetry: 5,
// Delay between retries in milliseconds
delay: 2000
};
var resolute_callback = function(retryCount) {
console.log(retryCount);
};
var resolute = new Resolute(resolute_options, resolute_callback);
// Run the operation stored in options.
resolute.run().then(null).catch(function(err) {
console.log("failed after trying: " + resolute.maxRetry + " times, with error: " + err);
});
// Pass in a new operation to perform using the same Resolute instance.
resolute.run(somePromiseOperation).then(null).catch(function(err) {
console.log("failed after trying: " + resolute.maxRetry + " times, with error: " + err);
});
By passing in the exponential backoff flag resolute will exponentially increase the waiting time between retries.
...
var resolute_options = {
// Reference to your Promise function, note: this Promise will always fail.
operation: somePromiseOperation,
// Maximum number of times to attempt
maxRetry: 5,
// Delay between retries in milliseconds
delay: 2000,
// exponentially increase wait time between retries
exponentialBackoff: true, //default false
};
var resolute_callback = function(retryCount, delay) {
console.log(`Retry ${retryCount} in ${delay} ms`);
};
var resolute = new Resolute(resolute_options, resolute_callback);
// Run the operation stored in options.
resolute.run().then(null).catch(function(err) {
console.log("failed after trying: " + resolute.maxRetry + " times, with error: " + err);
});
// Pass in a new operation to perform using the same Resolute instance.
resolute.run(somePromiseOperation).then(null).catch(function(err) {
console.log("failed after trying: " + resolute.maxRetry + " times, with error: " + err);
});
<script src="resolute.js"></script>
var somePromiseOperation = function() {
return new Promise(function(resolve, reject) {
// Make it fail...
if (err) return reject(err);
resolve("success");
});
};
var resolute_options = {
// Reference to your Promise function, note: this Promise will always fail.
operation: somePromiseOperation,
// Maximum number of times to attempt
maxRetry: 5,
// Delay between retries in milliseconds
delay: 2000
};
var resolute_callback = function(retryCount) {
console.log(retryCount);
};
var resolute = new Resolute(resolute_options, resolute_callback);
// Run the operation stored in options.
resolute.run().then(null).catch(function(err) {
console.log("failed after trying: " + resolute.maxRetry + " times, with error: " + err);
});
// Pass in a new operation to perform using the same Resolute instance.
resolute.run(somePromiseOperation).then(null).catch(function(err) {
console.log("failed after trying: " + resolute.maxRetry + " times, with error: " + err);
});
Contributors