1. /**
  2. * Handles record processing with graceful failure.
  3. * @param {object} record The record to process.
  4. * @param {function} processRecord Function to process the record. Should return a Promise.
  5. * @param {function} onError Function to handle errors. Takes the record and error as arguments.
  6. * @returns {Promise<object>} A promise that resolves with the processed record or rejects with the last error.
  7. */
  8. async function processRecordGracefully(record, processRecord, onError) {
  9. try {
  10. // Attempt to process the record
  11. const result = await processRecord(record);
  12. // If processing is successful, return the result
  13. return result;
  14. } catch (error) {
  15. // Handle errors gracefully
  16. console.error("Error processing record:", record, error);
  17. onError(record, error); // Call the onError callback
  18. // Optionally, you can log the error to a monitoring system here.
  19. // Re-throw the error to propagate it to the caller (if desired).
  20. // throw error;
  21. //Return a rejected promise if the error is not handled by onError
  22. throw error;
  23. }
  24. }
  25. /**
  26. * Example usage (for testing/demonstration)
  27. */
  28. //Simulated processRecord function
  29. async function simulateProcessRecord(record) {
  30. return new Promise((resolve, reject) => {
  31. setTimeout(() => {
  32. if (record.id % 3 === 0) {
  33. resolve({ ...record, processed: true });
  34. } else if (record.id % 5 === 0) {
  35. reject(new Error("Simulated processing error for id: " + record.id));
  36. } else{
  37. resolve({ ...record, processed: true });
  38. }
  39. }, 50); // Simulate some asynchronous operation
  40. });
  41. }
  42. /**
  43. * Example onError function
  44. */
  45. function exampleOnError(record, error) {
  46. console.warn("Record failed to process:", record, error.message);
  47. // Optionally, you can add logic to retry the record later.
  48. }
  49. //Example usage:
  50. async function runExample() {
  51. const record1 = { id: 1, data: "data1" };
  52. const record2 = { id: 2, data: "data2" };
  53. const record3 = { id: 3, data: "data3" };
  54. const record4 = { id: 5, data: "data5" };
  55. try {
  56. const result1 = await processRecordGracefully(record1, simulateProcessRecord, exampleOnError);
  57. console.log("Record 1 processed:", result1);
  58. const result2 = await processRecordGracefully(record2, simulateProcessRecord, exampleOnError);
  59. console.log("Record 2 processed:", result2);
  60. const result3 = await processRecordGracefully(record3, simulateProcessRecord, exampleOnError);
  61. console.log("Record 3 processed:", result3);
  62. const result4 = await processRecordGracefully(record4, simulateProcessRecord, exampleOnError);
  63. console.log("Record 4 processed:", result4);
  64. } catch (error) {
  65. console.error("Unhandled error:", error);
  66. }
  67. }
  68. runExample();

Add your comment