Javascript 在redux传奇中,有没有更简单的方法来采取多种类型的动作?
我有一个redux传奇,它应该把产品从DB带到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
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