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

使用redux saga时,等待redux操作完成调度

刘才俊
2023-03-14

我有一个redux saga设置,工作正常。我的一个分派任务是创建一个新订单,然后一旦创建了订单,我就想用更新后的状态做一些事情。

// this.props.userOrders = []

dispatch(actions.createOrder(object))

doSomethingWith(this.props.userOrders)

由于 createOrder 操作触发调用 API 的重订传奇,因此存在延迟,因此在我的函数 do 之前不会更新此 .props.user 命令某些内容被调用。我可以设置一个超时,但这似乎不是一个可持续的想法。

我已经阅读了有关Stack Overflow的类似问题,并尝试在相关的地方实现方法,但我似乎无法让它工作。我希望通过下面的代码,有人可以添加几行就可以做到这一点。

以下是相关的其他文件:

actions.js

导出const createUserOrder=(数据)=

Sagas.js

function * createUserOrder () {
  yield takeEvery('CREATE_USER_ORDER', callCreateUserOrder)
}

export function * callCreateUserOrder (newUserOrderAction) {
  try {
    const data = newUserOrderAction.data
    const newUserOrder = yield call(api.createUserOrder, data)
    yield put({type: 'CREATE_USER_ORDER_SUCCEEDED', newUserOrder: newUserOrder})
  } catch (error) {
    yield put({type: 'CREATE_USER_ORDER_FAILED', error})
  }
}

阿皮耶斯

export const createUserOrder = (data) => new Promise((resolve, reject) => {
  api.post('/userOrders/', data, {headers: {'Content-Type': 'application/json'}})
    .then((response) => {
      if (!response.ok) {
        reject(response)
      } else {
        resolve(data)
      }
    })
})

订单减速机:

case 'CREATE_USER_ORDER_SUCCEEDED':
   if (action.newUserOrder) {
      let newArray = state.slice()
      newArray.push(action.newUserOrder)
          return newArray
       } else {
       return state
   }

共有1个答案

陈松
2023-03-14

这感觉是个XY问题。您不应该在任何时候“等待”组件的生命周期函数/事件处理程序,而是应该利用html" target="_blank">存储的当前状态。

如果我没理解错,这是你目前的流程:

在 React 组件中分派操作CREATE_USER_ORDER。此操作由您的呼叫创建用户订单传奇使用。当您的创建订单传奇完成时,它会调度另一个“已完成”操作,您已经CREATE_USER_ORDER_SUCCEEDED该操作

您现在应该添加的是适当的减速器/选择器来处理您的CREATE_USER_ORDER_SUCCEEDED

这个CREATE_USER_ORDER_SUCCEEDED操作应该由您的还原程序处理,以创建一个新的状态,其中填充了您状态中的一些“orders”属性。这可以通过选择器直接连接到您的组件,此时您的组件将被重新呈现并This.props。userOrders已填充。

例:

组件

class OrderList extends React.PureComponent {
  static propTypes = {
    userOrders: PropTypes.array.isRequired,
    createOrder: PropTypes.func.isRequired,
  }

  addOrder() {
    this.props.createOrder({...})
  }

  render() {
    return (
      <Wrapper>
        <Button onClick={this.addOrder}>Add Order</Button>
        <List>{this.props.userOrders.map(order => <Item>{order.name}</Item>)}</List>
      </Wrapper>
    )
  }
}

const mapStateToProps = state => ({
  userOrders: state.get('userOrders'),
})

const mapDispatchToProps = {
  createOrder: () => ({ type: 'CREATE_ORDER', payload: {} }),
}

export default connect(mapStateToProps, mapDispatchToProps)(OrderList)

减速机

case 'CREATE_USER_ORDER_SUCCEEDED':
  return state.update('userOrders',
    orders => orders.concat([payload.newUserOrder])
  )

如果你真的需要副作用,那么把这些副作用添加到你的传奇故事中,或者创建一个新的传奇故事,采取成功的行动。

 类似资料:
  • 我正在Eclipse中使用Java运行selenium RC。我遇到的问题是selenium.click命令。我点击的链接加载一个新页面。有时需要5秒,有时需要2-3分钟。每次我看到页面加载时,在我的测试失败后,我立即得到消息“Timed out waiting for action to finish”。 我尝试使用Selenium.IsElementPresent检查正在加载的页面。但是,当我

  • 我是一个新的反应,但我已经工作了很多年的Vue。当我需要等待一个动作完成时,我现在被困在一个区域。在操作完成后,我必须进行另一个操作调用或在那里执行一些操作。但它不会等待操作完成并开始执行下面的代码。 方法: 从其中调度操作的方法: 现在,在上面的代码中,重定向并不是在等待调度完成。我试过这个,但它不起作用:

  • 他说,我有一个问题,我需要发送多个AJAX调用到同一个URL,但数据不同。我需要将其分块发送,并等待所有请求完成,然后再执行每个函数。 我做了一个简单的区块函数,将我的数组切片并将其分为多个组。 我的代码: 我需要在最后得到一个完整的数组来保存我所有的resp数据 我不能做$。当(),因为我不能命名函数,我也不知道如何使用$。deverred()在这个函数中你能帮我吗? 谢谢

  • 问题内容: 我不确定如何处理这种情况,因为我是iOS开发和Swift的新手。我正在像这样执行数据获取: 我的loadShows()函数解析从加载到UIWebView的网站中获取的大量数据。问题是我在loadShows函数中有一个等待10秒钟左右的计时器。这允许页面中的javascript在开始解析数据之前完全加载。我的问题是完成处理程序在我的loadShows()之前完成。 我想做的是为“ isC

  • 问题内容: 我有一个循环,可以调用API并将结果编译成数组。我如何等待所有调用完成后才能恢复执行?我看到了一系列有关如何等到打完一个电话的答案,但我不知道如何检查所有这些。如果我做一个while循环,一直等到’obj’是正确的长度,则页面只会停顿直到调用完成,这不是我想要的。请帮助? 问题答案: 如果您使用jQuery的deferred,这很容易。有一种方法,等待多个诺言完成,然后运行回调。那就是

  • 问题内容: 我知道这个问题以前曾被问过,但是所有解决方案都不适合我。 我有一个将参数发送到API的函数,并以列表的形式返回数据。我有一个UITableView设置为使用该列表,但是它在列表分配给变量之前运行。 码: 如果不立即将其作为重复投票,我将不胜感激,这是我尝试的方法。 派遣组 信号量计时 运行变量 其中包括= self和= self 。 编辑:要求提取项目, 问题答案: 您不能-也不应该-