【问题标题】:How to take multiple actions dispatched with blocking call如何采取通过阻塞调用调度的多个操作
【发布时间】:2019-11-21 11:03:20
【问题描述】:

我有一个 saga 正在听一个动作。 当这个动作被调度时,它会执行一个阻塞调用。

问题是同时调度了很多动作(相同的动作),而我的 saga 不能采取所有的动作。但是我需要同步处理每个动作。

我知道这是 redux-saga 文档中的一个已知问题:My Saga is missing dispatched actions

但事实是我不能使用分叉,因为我确实需要在处理新的调用之前结束之前的调用。

这是我的代码:

export function* readProducts() {
    while (true) {
        const {
            payload: { tags },
        } = yield take(RFID__ADD_PRODUCT);

        // sequential add of each item
        for (const tag of tags) {
            yield call(addProductViaRfid, tag);
        }
    }
}

有人有解决办法吗?

【问题讨论】:

  • 我认为你应该阅读这个 redux-saga.js.org/docs/advanced/Channels.html ,尤其是它使用 channelbuffers 来保存传入请求的最后一部分。像这样,@ 987654326@ 我已经处理了与您的情况非常相似的情况,但我的是将一些块上传到服务器。我认为这将是相同的方法。
  • 是的,这正是我所需要的!我认为我不需要缓冲区,但 actionChannel 正是它,谢谢,我得到的第一个答案就是这样 ;)

标签: javascript ecmascript-6 redux redux-saga


【解决方案1】:

您可以创建缓冲操作通道并从中执行操作。

export function* readProducts() {
    const addProductRequests = yield actionChannel(RFID__ADD_PRODUCT);
    while (true) {
        const {
            payload: { tags },
        } = yield take(addProductRequests);

        // sequential add of each item
        for (const tag of tags) {
            yield call(addProductViaRfid, tag);
        }
    }
}

【讨论】:

  • 非常感谢,这正是我们正在寻找的!
猜你喜欢
  • 2017-11-19
  • 2019-11-21
  • 2011-11-15
  • 2018-01-27
  • 2013-11-16
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多