【问题标题】:Call an ActionCreator from another ActionCreator从另一个 ActionCreator 调用一个 ActionCreator
【发布时间】:2020-08-16 19:36:42
【问题描述】:

我需要从另一个人那里调用 ActionCreator

ducks/products.ts - 产品的 ActionCreator 和 Reducers...

import { setStock } from './Store.ts';
//....
export const addProduct = (product: IProduct) => async (
  dispatch: Dispatch,
  getState: () => IState,
  { auth }: IServices
) => {
    dispatch(fetchStart());

    const response = await Axios.post('/api/products', product)

    const producto = response.data as IDataProduct

    // # I need to call SetStock() 
    // # [Try 1] to Call
    setStock(producto)

    // # [Try 2] to Call
    // return (dispatch2: any) => {
      //  dispatch2(
         //setStock(producto._id)
        //  )
    // }

    dispatch(fetchSucess(producto))
};

我看到一个例子,使用了try 2,但是不起作用,first try什么也没做,

ducks/stores.ts

export const setStock = (product: any) => async (
  dispatch: Dispatch,
  getState: () => any,
  { auth, db }: IServices
) => {
  console.log('INIT SETSTOCKACTIONCREATOR....')
  dispatch(fetchStart());
  try {
    const ref = db.collection("stores").doc(storeId);    
    await ref.update({ [product._id]: product.newStock });

    dispatch(updateSucess({ _id: storeId, stock: product.newStock, productId: product.productId }));

  } catch (error) {    
    dispatch(fetchError(error));
  }
};

我无法执行 Dispatch(setStock(producto)),因为我从打字稿中得到以下信息:

'(dispatch: Dispatch, getState: () => any, { auth, db }: IServices) => Promise' 类型的参数不可分配给'AnyAction' 类型的参数。

类型 '(dispatch: Dispatch, getState: () => any, { auth, db }: IServices) => Promise' 中缺少属性 'type' 但在类型 'AnyAction' 中是必需的

【问题讨论】:

  • 您的 thunk 操作需要返回一个承诺(尤其是 setStock)。然后在 addProduct 中您可以这样做:await dispatch(setStock(producto)) 您还将产品 id 传递给 setStock 但我认为 setStock 期望产品本身。
  • 我做不到,我收到打字稿错误,缺少类型属性并且 setStock 不能分配给 AnyAction

标签: reactjs typescript redux


【解决方案1】:

您只需要像 dispatch(setStock(producto._id)) 这样发送 setStock 操作,这与您为 fetchStart 执行的操作类似

export const addProduct = (product: IProduct) => async (
  dispatch: ThunkAction<Promise<void>, {}, {}, AnyAction>,
  getState: () => IState,
  { auth }: IServices
) => {
    dispatch(fetchStart());

    const response = await Axios.post('/api/products', product)

    const producto = response.data as IDataProduct

    dispatch(setStock(producto._id))


    dispatch(fetchSucess(producto))
};

【讨论】:

  • 我不能,当我尝试这样做时,我从打字稿中得到了这个,类型的参数 '(dispatch: Dispatch, getState: () => any, { auth, db }: IServices) => Promise' 不可分配给“AnyAction”类型的参数。类型 '(dispatch: Dispatch, getState: () => any, { auth, db }: IServices) => Promise' 中缺少属性 'type' 但在类型 'AnyAction' 中是必需的
  • OP 可能想要等待 setStock 完成,所以 setStock 应该返回,setStock 似乎收到了产品而不是产品的 id,所以类似于 await dispatch(setStock(product))。我假设使用了 thunk,因此您可以等待其他 thunk 操作。
  • @AndresGaibor Import Dispatch type from thunk
  • 从 redux-thunk 导入 ThunkAction 作为 Dispatch 类型。查看这篇文章了解更多信息:ThunkAction, {}, {}, AnyAction>
猜你喜欢
  • 2019-08-31
  • 2019-01-14
  • 1970-01-01
  • 2018-10-28
  • 2018-12-16
  • 1970-01-01
  • 2018-02-28
  • 2021-09-29
  • 2016-10-30
相关资源
最近更新 更多