mobxjs / mobx-state-tree

Full-featured reactive state management without the boilerplate
https://mobx-state-tree.js.org/
MIT License
6.94k stars 640 forks source link

fix abort flow cause error #1969

Closed kaven276 closed 1 year ago

kaven276 commented 2 years ago

in packages/mobx-state-tree/src/core/flow.ts, before this fix, when middleware call abort(),

     function onFulfilled(res: any) {
                let ret
                try {
                    // prettier-ignore
                    const cancelError: any = wrap((r: any) => { ret = gen.next(r) }, "flow_resume", res)
                    if (cancelError instanceof Error) {
                        ret = gen.throw(cancelError);
                    }
                } catch (e) {
                    // prettier-ignore
                    setImmediateWithFallback(() => {
                        wrap((r: any) => { reject(e) }, "flow_throw", e)
                    })
                    return
                }
                next(ret)
                return
            }

      function next(ret: any) {
                if (ret.done) {

gen.next(r) will not be called, and variable "ret" must be undefined, so in function next, ret.done will raise access undefined's property exception.

I design when abort(Error), call ret = gen.throw(cancelError), so ret is normal generator step's result (have .done/.value), it fix the undefined error TypeError: Cannot read properties of undefined (reading 'done') return; , it also cause flow to fin (before, gen is just hung forever)。

see https://github.com/mobxjs/mobx-state-tree/issues/621

jamonholmgren commented 1 year ago

Thanks for the PR, @kaven276 ! Would you be able to add a regression test?

jamonholmgren commented 1 year ago

Fixed in v5.1.8: https://github.com/mobxjs/mobx-state-tree/releases/tag/v5.1.8