Guest User

Untitled

a guest
Mar 23rd, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.26 KB | None | 0 0
  1. const { Effect, EffectResultPromise, EffectResultWrapper } = require('./effect-common')
  2.  
  3. module.exports = function race(...effects) {
  4. let index = -1
  5. let temps
  6. let p
  7. return Effect(() => {
  8. const racePromise = EffectResultPromise()
  9.  
  10. temps = effects.map((effect, idx) => {
  11. const preResult = effect.effectFunc()
  12. const p = preResult.resultPromise.then(ret => {
  13. temps[idx].result = ret
  14. if (ret.succFlag == 0 && index == -1) {
  15. index = idx
  16. racePromise.succ(ret.result, ret.succResultParams, ret.failResultParams)
  17. temps.filter((t, i) => i != idx).forEach(t => t.cancel())
  18. }
  19. })
  20. return {
  21. effect,
  22. p,
  23. cancel: preResult.cancel
  24. }
  25. })
  26.  
  27. p = Promise.all(temps.map(t => t.p)).then(() => {
  28. const flag = temps.map(t => t.result.succFlag != 0).reduce((s, e) => s && e)
  29. if (flag) {
  30. racePromise.fail(undefined, new Error('all effects fail'))
  31. }
  32. })
  33.  
  34. return EffectResultWrapper(racePromise, () => { })
  35. }
  36. , () => p.then(() => temps.forEach((t, idx) => idx == index ? t.effect.succFunc(t.result.succResultParams) : t.effect.failFunc(t.result.failResultParams)))
  37. , () => p.then(temps.forEach(t => t.result.failFunc(t.result.failResultParams))))
  38. }
Add Comment
Please, Sign In to add comment