class QueueGuard {
constructor(queue) {
this.queue = queue;
}
/**
* Executes a function on the queue, handling potential errors.
* @param {function} task - The function to execute.
* @param {number} [maxRetries=3] - Maximum number of retries.
* @param {number} [retryDelay=1000] - Delay between retries in milliseconds.
* @returns {Promise<any>} - A promise that resolves with the result of the task or rejects if all retries fail.
*/
async executeTask(task, maxRetries = 3, retryDelay = 1000) {
let retries = 0;
while (retries < maxRetries) {
try {
const result = await task();
return result; // Success, return the result
} catch (error) {
retries++;
console.warn(`Task failed (attempt ${retries}/${maxRetries}):`, error);
if (retries < maxRetries) {
await new Promise(resolve => setTimeout(resolve, retryDelay)); // Wait before retrying
} else {
throw error; // Re-throw the error if all retries failed
}
}
}
throw new Error("Max retries reached without success."); //Should not reach here, but good to have.
}
/**
* Adds a task to the queue, guarded by the QueueGuard.
* @param {function} task - The function to add to the queue.
*/
addGuardedTask(task) {
this.queue.push(async () => {
try {
return await this.executeTask(task);
} catch (error) {
console.error("Task failed within guarded execution:", error);
throw error; // Re-throw to propagate the error if needed.
}
});
}
}
//Example Usage:
//const myQueue = [];
//const queueGuard = new QueueGuard(myQueue);
//async function myTask() {
// // Simulate an exploratory task that might fail
// return new Promise((resolve, reject) => {
// setTimeout(() => {
// if (Math.random() < 0.5) {
// resolve("Task completed successfully!");
// } else {
// reject(new Error("Task failed intentionally!"));
// }
// }, 500);
// });
//}
//queueGuard.addGuardedTask(myTask);
//async function processQueue() {
// while(myQueue.length > 0){
// const task = myQueue.shift();
// try {
// const result = await task();
// console.log("Queue Result:", result);
// } catch(error){
// console.error("Queue Error: ", error);
// }
// }
//}
//processQueue();
Add your comment