fix(mobile): 底部Tab点击无响应+登录窗叠开——①_mobile_bar_clicked不解包dispatch事件({params:数据})致item.name恒undefined静默return(实测根因,Toolbar/Menu同约定);②withLoginInfo加登录窗单例_bricks._login_window_pending,并发401共享一窗后来者等销毁后重试,重试逻辑抽_retry_after_login共享尾部(2026-09-08用户报障)

This commit is contained in:
yumoqing 2026-09-08 15:27:13 +08:00
parent dc534768ea
commit 9f3155a9f2
2 changed files with 17 additions and 1 deletions

View File

@ -168,6 +168,14 @@ bricks.HttpText = class {
return result;
}
async withLoginInfo(url, opts){
// 登录窗单例2026-09-08手机首屏并发多个 401 请求时,旧实现每个请求
// 各建一个登录窗 → 叠开多个登录页。共享同一个窗:后来者等它销毁后重试。
if (bricks._login_window_pending){
await new Promise(resolve => {
bricks._login_window_pending.bind('destroy', resolve);
});
return await this._retry_after_login(url, opts);
}
var login_window = await bricks.widgetBuild({
"widgettype":"urlwidget",
"options":{
@ -182,12 +190,16 @@ bricks.HttpText = class {
console.log('withLoginInfo: failed to build login widget');
return null;
}
bricks._login_window_pending = login_window;
// Wait for login window to be destroyed (successful login)
await new Promise(resolve => {
login_window.bind('destroy', resolve);
});
bricks._login_window_pending = null;
return await this._retry_after_login(url, opts);
}
async _retry_after_login(url, opts){
console.log('withLoginInfo: login window destroyed, retrying request');
// Retry the original request

View File

@ -104,6 +104,10 @@ bricks.TabPanel = class extends bricks.Layout {
this._mobile_bar_apply(bricks.is_mobile());
}
_mobile_bar_clicked(item){
// bind 事件经 dispatch 包装为 {params: 数据}Toolbar/Menu 同约定);
// 框架内部直调传裸对象 —— 两种形态都兼容2026-09-08 实测:不解包则
// 用户点底部 Tab 静默无响应)
if (item && item.params) item = item.params;
var desc = null;
for (var i=0;i<this._mobile_bar_descs.length;i++){
if (this._mobile_bar_descs[i].name === item.name){ desc = this._mobile_bar_descs[i]; break; }