在使用 google 标签管理器之前,如何等待 Redux Saga 中的状态发生变化?
How can I wait for state to change in Redux Saga before using google tag manager?
我正在尝试将 google 标签管理器添加到我们使用 Redux Saga 的项目中。我对 redux saga 或 gtm 都不是很熟悉。我想要做的是创建一个如下所示的 gtm:
TagManager.dataLayer({
dataLayer: {
event: 'login',
userId: user.UserID,
locale
}
})
我希望事件在用户登录时触发。我遇到的问题是我无法获取用户 ID,因为事件是在我拥有用户 ID 之前触发的,因此在中显示为 undefined
通用汽车。传奇看起来像这样:
// Login user
export function* loginSaga(action) {
yield put(actions.loginStart());
const payload = {
username: action.username,
password: action.password
};
try {
const response = yield axios.post('/api/auth/login', payload);
const locale = yield select(state => state.common.locale);
const user = yield select(state => state.user.user);
if (response.data.success) {
const token = yield response.data.data.Token;
yield cookies.set('uid', token, { path: '/' });
yield put(actions.getUser(token));
yield put(actions.loginSuccess(token));
yield put(actions.closeModal());
TagManager.dataLayer({
dataLayer: {
event: 'login',
userId: user.UserID,
locale
}
});
}
是否可以等到 userid 不再未定义,然后触发 gtm,这样做的最佳做法是什么?
如果您有任何问题,请告诉我,我想您也有。正如我之前提到的,我对此很陌生。
谢谢!
使用下面的代码行,在您创建 axios.post 之后,您不会存储用户详细信息状态,但很快在下一行中您将尝试获取 user/locale 详细信息。编辑 - user
也需要从另一个 ation 更新的商店中获取。因此它们是未定义的。
解法:
使用 take 等待操作完成。
像这样
try {
const response = yield axios.post("/api/auth/login", payload);
// wait until one of the success or failure action is dispatched
yield take([ACTION_TYPES.GET_USER_DETAILS]);//provide your action type here
const locale = yield select((state) => state.common.locale);
const user = yield select((state) => state.user.user);
...
我正在尝试将 google 标签管理器添加到我们使用 Redux Saga 的项目中。我对 redux saga 或 gtm 都不是很熟悉。我想要做的是创建一个如下所示的 gtm:
TagManager.dataLayer({
dataLayer: {
event: 'login',
userId: user.UserID,
locale
}
})
我希望事件在用户登录时触发。我遇到的问题是我无法获取用户 ID,因为事件是在我拥有用户 ID 之前触发的,因此在中显示为 undefined
通用汽车。传奇看起来像这样:
// Login user
export function* loginSaga(action) {
yield put(actions.loginStart());
const payload = {
username: action.username,
password: action.password
};
try {
const response = yield axios.post('/api/auth/login', payload);
const locale = yield select(state => state.common.locale);
const user = yield select(state => state.user.user);
if (response.data.success) {
const token = yield response.data.data.Token;
yield cookies.set('uid', token, { path: '/' });
yield put(actions.getUser(token));
yield put(actions.loginSuccess(token));
yield put(actions.closeModal());
TagManager.dataLayer({
dataLayer: {
event: 'login',
userId: user.UserID,
locale
}
});
}
是否可以等到 userid 不再未定义,然后触发 gtm,这样做的最佳做法是什么?
如果您有任何问题,请告诉我,我想您也有。正如我之前提到的,我对此很陌生。
谢谢!
使用下面的代码行,在您创建 axios.post 之后,您不会存储用户详细信息状态,但很快在下一行中您将尝试获取 user/locale 详细信息。编辑 - user
也需要从另一个 ation 更新的商店中获取。因此它们是未定义的。
解法:
使用 take 等待操作完成。
像这样
try {
const response = yield axios.post("/api/auth/login", payload);
// wait until one of the success or failure action is dispatched
yield take([ACTION_TYPES.GET_USER_DETAILS]);//provide your action type here
const locale = yield select((state) => state.common.locale);
const user = yield select((state) => state.user.user);
...