[go: up one dir, main page]

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Question] Best practice on call this in reducers and get updated state in effects. #984

Open
pingfengafei opened this issue Sep 11, 2023 · 0 comments
Labels

Comments

@pingfengafei
Copy link
pingfengafei commented Sep 11, 2023

Hi Rematcher, need help to answer this two best practice for two scenario.

// models files named: foo.js

export {
   models: {
      foo: {};
   },
   reducers: {
      const upldateFoo = (state, foo) => ({ ...state, foo });
      const updateFooProperties = (state, properties) => {
         const foo = { ...state.foo, ...properties};
        // Question here call this method in reducers.
        return this[foo/upldateFoo](state, foo);
      }
   },
   effects: {
       const update(foo){
         // error here: nextFoo is a Promise since not await this.updateFoo
          const nextFoo = this.updateFoo(foo);
        
         // question here: don't want to use async in effect here, to get the latest state, I called getState method from redux. 
         //  now get the correct one.
         const nextFoo = getState().foo.foo;
     }
   }
}

My question is: does the two resolve way are best practice in rematch.

1. Call this in reducers.
2. getState in effects.

Thinking about 1: Call this in reducers.

I thinks reducers and effects are extended from redux reducer and side-effect. it is quite common with computing states via compose reducers in redux, I didn't check the detail implementation of this in rematch, it seems that rematch does not recommend using this in effect so that design a strange pattern with: this[modelName/reducerMethodName] instead of using this in effects: this.effectMethodName

Thinking about 2: getState in effects.

It is not a wildly used but really existing case in real world: get the latest state after state updated in a effect, like:

onEffect() {
   this.onReducer1();
   // have to get the updated state to do other things
  this.onReducer2();
  // have to get the updated state to do other things
}

At very beginning, I suppose reducer method return object directly, like this:

const nextState = this.onReducer();

However, nextState is a Promise not object.

Hoho, let's await the result:

const nextState = await this.onReducer();

sadly, nextState also is not the nextState as expected. it returns:

   { type: modeName/reducerName, payload}

so can not get nextState from reducer method response.

Now seems there are only two ways to get the latest state:

options 1: getState() as mentioned above.

options 2: call another effects:

onEffect() {
   this.onReducer1();
   this.onEffectComplted();
}

onEffectCompleted(_, state) {
   // now state is the latest one and do work on the state.
   this.onReducer2();
  this.onEffectCompletedCompleted();
}

onEffectCompletedCompleted(_, state) {
  // now state is the latest one and do work on the state.
}

Now this pattern becomes effect compose which seems not recommended in reducer compose.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant