Advertisement
TheTintin

recursive middlewares like with promises

Sep 2nd, 2019
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const displaySeparation = payload => new Promise((resolve, reject) => {
  2.     if (!payload || !payload.title) return reject('No title !')
  3.  
  4.     console.log(new Date(), `-- ${payload.title} --------------------------------------`)
  5.     resolve()
  6. })
  7.  
  8. const readSomething = payload => new Promise((resolve, reject) => {
  9.     if (!payload || !payload.numbers) return reject('No numbers !')
  10.  
  11.     console.log(new Date(), 'Adding numbers')
  12.     payload.numbers.push(8)
  13.     payload.numbers.push(4)
  14.  
  15.     setTimeout(() => {
  16.         resolve()
  17.     }, 2000)
  18. })
  19.  
  20. const addValue = value => payload => new Promise((resolve, reject) => {
  21.     if (!payload || !payload.numbers) return reject('No numbers !')
  22.  
  23.     console.log(new Date(), `Adding ${value}`)
  24.     payload.numbers.push(value)
  25.  
  26.     setTimeout(() => {
  27.         resolve()
  28.     }, 1000)
  29. })
  30.  
  31. const doSomething = payload => new Promise((resolve, reject) => {
  32.     if (!payload || !payload.numbers) return reject('No numbers !')
  33.  
  34.     console.log(new Date(), 'Making the sum of numbers')
  35.     payload.result = payload.numbers.reduce((a, b) => a + b)
  36.  
  37.     setTimeout(() => {
  38.         resolve()
  39.     }, 3000)
  40. })
  41.  
  42. const writeSomething = payload => new Promise((resolve, reject) => {
  43.     if (!payload || !payload.numbers || !payload.result) return reject('No result !')
  44.  
  45.     console.log(new Date(), `${payload.numbers.join(' + ')} = ${payload.result}`)
  46.  
  47.     setTimeout(() => {
  48.         resolve()
  49.     }, 1000)
  50. })
  51.  
  52. // -- Middlewares style system ------------------------------------------------
  53.  
  54. const createProcess = tasks => payload => tasks.reduce((promiseChain, task) => promiseChain.then(() => Array.isArray(task) ? createProcess(task)(payload) : task(payload)), Promise.resolve())
  55.  
  56. // -- Exec --------------------------------------------------------------------
  57.  
  58. const fullCalc = createProcess([readSomething, doSomething, writeSomething])
  59. const makeSomething = createProcess([displaySeparation, fullCalc])
  60. const makeAnotherThing = createProcess([displaySeparation, doSomething, writeSomething])
  61. const merged = createProcess([makeSomething, readSomething, doSomething, writeSomething])
  62. const recursive = createProcess([
  63.     readSomething,
  64.     [
  65.         addValue(5),
  66.         addValue(7),
  67.         addValue(9)
  68.     ],
  69.     doSomething,
  70.     writeSomething
  71. ])
  72.  
  73. makeSomething({ title: 'Process #1', numbers: [3, 8] })
  74.     .then(() => makeSomething({ title: 'Process #2', numbers: [4, 10] }))
  75.     .then(() => makeAnotherThing({ title: 'Process #3', numbers: [1, 2, 3] }))
  76.     .then(() => makeAnotherThing({ title: 'Process #4', numbers: [7, 6, 9] }))
  77.     .then(() => merged({ title: 'Process #5', numbers: [1, 4, 9] }))
  78.     .then(() => recursive({ title: 'Process #1', numbers: [3, 8] }))
  79.     .catch(error => console.error(error))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement