我有redux传奇,应该将产品从DB提取到redux状态。但是它有一些依赖关系,必须首先获取。

const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])


页面加载时会分别触发对这些依赖项的请求。问题是它们以随机顺序返回,如果我想继续执行该函数的其余部分,则需要对它们都进行take设置。

我设法用这种疯狂的手段做到了这一点,这种手段行之有效,但是有没有更简单的方法呢?

另一个问题是,如果这两个

const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])


getProductSaga()甚至可以触发之前返回,然后整个函数被卡住。

这是此传奇的完整代码:

export function* getProductSaga(action) {
    try {
        const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])
        if (result.type === 'GET_CATEGORIES_SUCCESS') {
            yield take(['GET_TYPES_SUCCESS'])
        } else {
            yield take(['GET_CATEGORIES_SUCCESS'])
        }
        const product = yield call(api.product.get, action.id)
        yield put(getProductSuccess(product))
        yield put(setEditLoadingSuccess(action.id))
    } catch (err) {
        console.error(err.response.data.errors)
    }
}

最佳答案

我设法用这种疯狂的手段做到了这一点,这种手段行之有效,但是有没有更简单的方法可以做到这一点?


是的,使用all。它将运行任意数量的效果,并等到效果全部完成后再继续进行下一行。

export function* getProductSaga(action) {
  try {
    // You can leave off the left hand side if you don't care about the results
    const [categoriesSuccessAction, typesSuccessAction] = yield all([
      take('GET_CATEGORIES_SUCCESS'),
      take('GET_TYPES_SUCCESS'),
    ]);

    const product = yield call(api.product.get, action.id)
    // etc
  } catch (err) {
    console.error(err.response.data.errors)
  }
}



  另一个问题是,如果在getProductSaga()甚至可以执行之前都返回了这两个函数,则整个函数将被卡住。


确实如此。如果您有合理的预期会发生这些动作,则只希望听这些动作。不幸的是,由于我不知道应用程序其余部分的架构,因此我无法提出非常具体的建议。也许您可以检查存储中是否包含某些值,如果是,则跳过take

关于javascript - 在redux-saga中是否有更简单的方法来采取多种 Action 类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56841126/

10-14 17:32