/**
* Handles record processing with graceful failure.
* @param {object} record The record to process.
* @param {function} processRecord Function to process the record. Should return a Promise.
* @param {function} onError Function to handle errors. Takes the record and error as arguments.
* @returns {Promise<object>} A promise that resolves with the processed record or rejects with the last error.
*/
async function processRecordGracefully(record, processRecord, onError) {
try {
// Attempt to process the record
const result = await processRecord(record);
// If processing is successful, return the result
return result;
} catch (error) {
// Handle errors gracefully
console.error("Error processing record:", record, error);
onError(record, error); // Call the onError callback
// Optionally, you can log the error to a monitoring system here.
// Re-throw the error to propagate it to the caller (if desired).
// throw error;
//Return a rejected promise if the error is not handled by onError
throw error;
}
}
/**
* Example usage (for testing/demonstration)
*/
//Simulated processRecord function
async function simulateProcessRecord(record) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (record.id % 3 === 0) {
resolve({ ...record, processed: true });
} else if (record.id % 5 === 0) {
reject(new Error("Simulated processing error for id: " + record.id));
} else{
resolve({ ...record, processed: true });
}
}, 50); // Simulate some asynchronous operation
});
}
/**
* Example onError function
*/
function exampleOnError(record, error) {
console.warn("Record failed to process:", record, error.message);
// Optionally, you can add logic to retry the record later.
}
//Example usage:
async function runExample() {
const record1 = { id: 1, data: "data1" };
const record2 = { id: 2, data: "data2" };
const record3 = { id: 3, data: "data3" };
const record4 = { id: 5, data: "data5" };
try {
const result1 = await processRecordGracefully(record1, simulateProcessRecord, exampleOnError);
console.log("Record 1 processed:", result1);
const result2 = await processRecordGracefully(record2, simulateProcessRecord, exampleOnError);
console.log("Record 2 processed:", result2);
const result3 = await processRecordGracefully(record3, simulateProcessRecord, exampleOnError);
console.log("Record 3 processed:", result3);
const result4 = await processRecordGracefully(record4, simulateProcessRecord, exampleOnError);
console.log("Record 4 processed:", result4);
} catch (error) {
console.error("Unhandled error:", error);
}
}
runExample();
Add your comment