Javascript 在redux传奇中,有没有更简单的方法来采取多种类型的动作?

Javascript 在redux传奇中,有没有更简单的方法来采取多种类型的动作?,javascript,redux,redux-saga,Javascript,Redux,Redux Saga,我有一个redux传奇,它应该把产品从DB带到redux州。但是它有一些依赖项,必须首先获取这些依赖项 const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS']) 当页面加载时,对这些依赖项的请求将单独触发。问题是,它们以随机顺序返回,如果我想继续执行函数的其余部分,我需要同时获取它们 我用这个疯狂的玩意儿做到了这一点,它很有效,但有没有更简单的方法呢 另一个问题是,如果这两个 const result

我有一个redux传奇,它应该把产品从DB带到redux州。但是它有一些依赖项,必须首先获取这些依赖项

const result = yield take(['GET_CATEGORIES_SUCCESS', 'GET_TYPES_SUCCESS'])
当页面加载时,对这些依赖项的请求将单独触发。问题是,它们以随机顺序返回,如果我想继续执行函数的其余部分,我需要同时获取它们

我用这个疯狂的玩意儿做到了这一点,它很有效,但有没有更简单的方法呢

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

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
s