故事板分享后进行轮播时,部分页面数据加载不了
Datart版本号 1.0.0-rc.1
错误描述 故事板在分享后,访问分享连接页后,轮播一段时间某个页面就获取不到数据了
如何重现 重现错误的步骤,例如:
- 配置两个仪表板,里面各有两个图表,并开启自动刷新数据(60s)
- 将两个仪表添加到一个故事板(1分钟轮播频率),并分享
- 访问分享连接,等一段时候后,有一个仪表板中的图表没有数据
- 通过查看网络请求,发下有一个图表请求后台execute接口时,没有带上executeToken
期望结果 在轮播过程中,图表数据正常展示
截图
可以看到有一个execute请求没有token,
我仔细看了下,总共有三个viz接口请求,第一个是通过故事板id获取故事板下面的两个仪表板
第二个viz和第三个viz分别是两个仪表板的请求,返回各自的executeToken
当第三个viz调用后,第二个viz请求返回的executeToken好像被覆盖了,导致它下面的图表请求没有token,加载不到数据
运行环境详情:(可选,取决于错误发生的具体位置)
- OS: CentOS Linux release 7.7.1908
- 数据源: Doris
- 浏览器: Microsoft Edge 版本 111.0.1661.43 (正式版本) (64 位)
其他内容 有关这个问题的任意其他内容
这个问题还没有解决吗 刚用到这个东西
自己尝试了这个方案,目前已解决。
1.在src/app/pages/SharePage/StoryPlayer/StoryPlayerForShare/StoryPlayerForShare.tsx文件中调用的getPageContentDetail方法中加一个参数needRefreshExecuteToken。
2.在src/app/pages/StoryBoardPage/slice/thunks.ts文件中调用的getBoardDetail方法中加一个参数needRefreshExecuteToken。
3.在src/app/pages/DashBoardPage/pages/Board/slice/thunk.ts文件中增加方法fetchBoardExecuteTokenInShare。
export const fetchBoardExecuteTokenInShare = createAsyncThunk<
null,
{
dashboardRelId: string;
vizToken: ExecuteToken;
filterSearchParams?: FilterSearchParams;
shareToken?: string;
}
>(
'board/fetchBoardExecuteTokenInShare',
async (params, { dispatch, rejectWithValue }) => {
const { vizToken, shareToken } = params;
const { data } = await request2<ShareVizInfo>({
url: `shares/${shareToken}/viz`,
method: 'POST',
data: {
authorizedToken: vizToken.authorizedToken,
},
});
console.log('fetchBoardExecuteTokenInShare', data.executeToken);
dispatch(
shareActions.setExecuteTokenMap({
executeToken: data.executeToken,
shareToken: data.shareToken,
}),
);
return null;
},
);
4.在src/app/pages/DashBoardPage/pages/Board/slice/thunk.ts文件中getBoardDetail方法内部 if (dashboard) 处取用缓存逻辑中重新获取ExecuteToken解决问题。
export const getBoardDetail = createAsyncThunk<
null,
{
dashboardRelId: string;
filterSearchParams?: FilterSearchParams;
vizToken?: ExecuteToken;
shareToken?: string;
needRefreshExecuteToken?: boolean;
}
>(
'board/getBoardDetail',
async (params, { getState, dispatch, rejectWithValue }) => {
// 1 在 内存里找到就返回
const dashboard = selectBoardById(
getState() as { board: BoardState },
params?.dashboardRelId,
);
if (dashboard) {
// console.log('needRefreshExecuteToken', params.needRefreshExecuteToken);
if (params.needRefreshExecuteToken && params.vizToken) {
await dispatch(
fetchBoardExecuteTokenInShare({ ...params, vizToken: params.vizToken }),
);
}
return null;
}
if (params.vizToken) {
await dispatch(
fetchBoardDetailInShare({ ...params, vizToken: params.vizToken }),
);
} else {
await dispatch(fetchBoardDetail(params));
}
return null;
},
);
您发的邮件,我已收到。