当前位置: 首页 > 知识库问答 >
问题:

在redux thunk发货后从商店退还promise

通京
2023-03-14

我正试着和redux thunk联系

function simple_action(){
  return {type: "SIMPLE_ACTION"}
}

export function async_action(){
  return function(dispatch, getState){
    return dispatch(simple_action).then(()=>{...});
  }
}

我如何让调度从商店返回promise?

更具体地说:

我可能只是不理解这里的一些内容,但在所有使用redux-thunk的示例中,它们调用一个单独的异步事件(比如fetch),它显然会返回一个promise

我特别想要的是当我向商店发送一个动作时:我如何确保商店在上面的函数action\u creator()中发生任何其他事情之前,已经完全处理了该动作。

理想情况下,我希望商店能回报一些promise,但我不明白这是怎么发生的,在哪里发生的?

共有3个答案

涂飞航
2023-03-14

dispatch将返回它调用的操作/函数返回的任何内容;因此,如果您想链接某些活动(根据您的示例),您的操作需要返回一个promise

正如@Aaleks提到的,如果你的行为是一个thunk,你可以创建一个场景,返回一个promise,然后你可以按照你提到的做。

顺便说一句,我认为命名你的thunkaction_creator有点误导,因为simple_action实际上是Redux语言中的Action Creator-已相应编辑:)

何章横
2023-03-14

这是我最近一直在使用的模式:

export const someThenableThunk = someData => (dispatch, getState) => Promise.resolve().then(() => {
  const { someReducer } = getState();
  return dispatch({
    type: actionTypes.SOME_ACTION_TYPE,
    someData,
  });
});

当您调度(一些ThenableThunk('hello-world'))时,它会返回一个Promise对象,您可以将进一步的操作链接到该对象。

柯子琪
2023-03-14

这里有一个关于如何调度和链接异步操作的示例。https://github.com/gaearon/redux-thunk

thunk中间件知道如何将thunk异步动作转化为动作,所以你只需要让你的simple_action()成为一个thunk,thunk中间件会为你完成这项工作,如果中间件看到一个正常的动作,他会像正常一样调度这个动作操作,但是如果它是一个异步函数,它会把你的异步操作变成正常操作。

所以你的简单动作需要是thunk(thunk是一个返回函数的函数)例如:

function makeASandwichWithSecretSauce(forPerson) {
  return function (dispatch) {
    return fetchSecretSauce().then(
      sauce => dispatch(makeASandwich(forPerson, sauce)),
      error => dispatch(apologize('The Sandwich Shop', forPerson, error))
    );
  };
}

当使用makeASandwichExticSauce函数时,您可以使用分派功能

store.dispatch(
  makeASandwichWithSecretSauce('Me')
);

甚至

// It even takes care to return the thunk’s return value
// from the dispatch, so I can chain Promises as long as I return them.

store.dispatch(
  makeASandwichWithSecretSauce('My wife')
).then(() => {
  console.log('Done!');
});

下面是一个完整的例子,说明如何编写动作创建者,从其他动作创建者那里调度动作和异步动作,并用promise构建控制流。

function makeSandwichesForEverybody() {
  return function (dispatch, getState) {
    if (!getState().sandwiches.isShopOpen) {
      // You don’t have to return Promises, but it’s a handy convention
      // so the caller can always call .then() on async dispatch result.
      return Promise.resolve();
    }

    //Do this action before starting the next one below 
    dispatch(simple_action());

    // We can dispatch both plain object actions and other thunks,
    // which lets us compose the asynchronous actions in a single flow.
    return dispatch(
      makeASandwichWithSecretSauce('My Grandma')
    ).then(() =>
      Promise.all([
        dispatch(makeASandwichWithSecretSauce('Me')),
        dispatch(makeASandwichWithSecretSauce('My wife'))
      ])
    ).then(() =>
      dispatch(makeASandwichWithSecretSauce('Our kids'))
    ).then(() =>
      dispatch(getState().myMoney > 42 ?
        withdrawMoney(42) :
        apologize('Me', 'The Sandwich Shop')
      )
    );
  };
}
//apologize and withdrawMoney are simple action like this for example
      return {
        type:  "END_SUCESS"
      }

//用法

store.dispatch(
  makeSandwichesForEverybody()
).then(() =>
    console.log("Done !");
);

为了创造你自己的promise,你可以使用像蓝鸟这样的图书馆。

//编辑:为了确保在函数action_creator()中发生任何其他操作之前,商店已经完全处理了该操作,您可以在action_creator()之前调度这个简单的_操作我在代码中添加了这个注释。//在开始下面的下一个操作之前执行此操作。

 类似资料:
  • 我想在谷歌地图上存储一些POI(兴趣点),只在android应用程序中使用 然后我想检索用户当前位置“x”km范围内的所有POI 所以,问题是:是否有可能将自定义数据存储在谷歌地图上供应用程序私人使用?(请提供任何示例的链接) 要存储的任何其他完全管理的解决方案

  • 1.买家发现地址填写错误或要更改收货地址该咋办? 在商家未发货之前,买家可以直接联系商家更改地址。

  • 商家发货 打开后台-订单-订单列表 1.点击筛选出待发货的订单可进行批量操作。批量发货、批量打印快递单、批量打印发货单。 2.点击发货时,弹出框显示待发货的商品,发货方式可选需要物流和无需物流。 选择物流公司:三通一达,并填写快递单号。 保存完成后,订单系统会显示已发货状态 3.当用户因更个人原因需要修改地址时,可协调商家对地址进行修改 点击修改地址时,弹出框显示收货人、收货人手机号、收货人固定电

  • 我将下面的道具(store Name)传递给我的组件: 我想用动态名称(this.props.reducerName)连接到存储 例如 如何装饰redux connect,或者我必须做什么? 我试图跳过redux连接并使用store.subscribe 但当我移动到另一页时,我看到以下错误: 警告:设置状态(…):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState

  • 供货商 供货商:指某个商品的供应商的信息。 1、批量删除:删除多个供货商的信息设置。 2、添加供货商:添加供货商的名称、联系人姓名、电话、地址以及对供货商的描述。

  • 我一直在研究这个问题,在提交我的代码后,7个案例通过了,然而,9个案例失败了。问题链接位于HackerRank:电子商店 问题陈述 一个女孩想买一个键盘和一个USB驱动器,她想尽可能多地花钱,但要在预算内(将这两个项目结合起来)。如果这两件物品的价格都超过了她的预算,那么退货-1,否则她就买不到了。强制性的是,她想买这两件东西,而不是一件。 例子 一系列键盘以数组的形式给出,USB驱动器以。现在,