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)。
in packages/mobx-state-tree/src/core/flow.ts, before this fix, when middleware call abort(),
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 errorTypeError: 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