Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const { Effect, EffectResultPromise, EffectResultWrapper } = require('./effect-common')
- module.exports = function race(...effects) {
- let index = -1
- let temps
- let p
- return Effect(() => {
- const racePromise = EffectResultPromise()
- temps = effects.map((effect, idx) => {
- const preResult = effect.effectFunc()
- const p = preResult.resultPromise.then(ret => {
- temps[idx].result = ret
- if (ret.succFlag == 0 && index == -1) {
- index = idx
- racePromise.succ(ret.result, ret.succResultParams, ret.failResultParams)
- temps.filter((t, i) => i != idx).forEach(t => t.cancel())
- }
- })
- return {
- effect,
- p,
- cancel: preResult.cancel
- }
- })
- p = Promise.all(temps.map(t => t.p)).then(() => {
- const flag = temps.map(t => t.result.succFlag != 0).reduce((s, e) => s && e)
- if (flag) {
- racePromise.fail(undefined, new Error('all effects fail'))
- }
- })
- return EffectResultWrapper(racePromise, () => { })
- }
- , () => p.then(() => temps.forEach((t, idx) => idx == index ? t.effect.succFunc(t.result.succResultParams) : t.effect.failFunc(t.result.failResultParams)))
- , () => p.then(temps.forEach(t => t.result.failFunc(t.result.failResultParams))))
- }
Add Comment
Please, Sign In to add comment