96SEO 2026-06-15 21:21 7
App.vue 仍然负责在小程序启动时发起静默登录。
先准备一个 silentAuth.ts,用于维护当前会话内的登录状态和登录 Promise。

Ru果页面进入后立刻调用需要登录态的接口,就可Neng出现页面接口先执行、登录接口还没完成的情况。解决这个问题的核心不是“在哪里调登录”,而是要把登录任务变成一个可等待的全局任务。
页面开始执行需要调用鉴权接口等待 App.vue 发起的静默登录 Promise检查 token 和 userIdRu果没有,主动补一次静默登录
检查 token 和 userId调用鉴权接口
为什么不直接在请求拦截器里等待登录?
Ke以Zuo,但不建议一上来就这么Zuo。
async function claimStartupReward { /** * Ru果页面没有拿到活动 ID,就不需要调用领取接口。 * * 这里用 activityId Zuo虚构示例: * 实际项目中Ke以替换成 couponId、taskId、resourceId 等任何业务参数。 */ if { console.log return } /** * 领取启动权益是鉴权接口。 * * 这里必须先等待 App.vue 中的静默登录完成, * 否则冷启动扫码时可Neng还没有 token,接口会出现 或业务失败。 */ const authReady = await ensureRequestAuthReady /** * Ru果仍然拿不到 userId,说明当前登录态不可用。 * * 这里不要继续调用领取接口,否则只会制造一次必然失败的请求。 * 具体业务Ke以选择跳过、提示用户、或引导登录。 */ if { console.warn return } /** * 登录态准备好后再调用需要鉴权的业务接口。 * * token 会由请求拦截器自动写入 Authorization 请求头。 */ await claimReward}
页面Zui终的执行顺序会变成:
说实话,你有没有遇到过百度不收录的问题?哈哈,那个那个,我之前就遇到过其实主要还是kan网站的质量和内容,你懂的。
/** * 确保微信小程序环境下Yi完成静默登录。 * * 这个方法用于解决“小程序冷启动时页面接口先于登录接口执行”的问题。 * 它会把当前正在执行的静默登录任务保存成全局 Promise,让多个页面Ke以等待同一个登录任务。 * * 执行逻辑: * . 非微信小程序环境直接返回 null。 * . Ru果Yi经有静默登录任务在执行,直接等待这一个任务,不重复发起登录。 * . Ru果当前会话Yi经有 token 和 userId,且没有强制刷新要求,直接复用当前登录态。 * . Ru果没有可用登录态,则调用 wx.login 获取 code,再请求后端静默登录接口。 * . 登录成功后把 token 写入当前会话内存,并把用户信息写入 userStore。 * . 登录结束后清空全局 Promise,保证下一次需要时Ke以重新发起登录。 * * @param query 启动参数或页面参数,可用于透传活动码、邀请人 ID 等渠道信息。 * @param options 静默登录配置。 * @param options.force 是否强制重新执行静默登录;默认 false。 * @returns 静默登录状态;登录失败或非微信小程序环境时返回 null。 */export async function ensureMiniProgramSilentLogin { /** * 非微信小程序环境不执行微信静默登录。 * * 这一步Ke以根据项目实际情况调整。 * Ru果 H5、App 端也有自己的登录初始化逻辑,Ke以在这里Zuo平台分支。 */ if { return null } const { force = false } = options const userStore = useUserStore /** * Ru果Yi经有静默登录任务正在执行,直接等待这个任务。 * * 这样Ke以避免多个页面同时触发静默登录,导致重复请求 wx.login * 或重复请求后端 silentLogin 接口。 */ const pendingTask = getSilentAuthReadyPromise if { const readyState = await pendingTask /** * Ru果登录成功,并且项目还需要额外拉取用户资料, * Ke以在这里继续补齐 userStore。 */ if { await syncUserProfile } return readyState } /** ...
这个函数的重点是“并发复用”。
onLaunch => { /** ...
这里不需要在 App.vue 里阻塞所有页面。
这个接口需要 userId,请求头也需要 token。所以调用前必须等待登录态准备好。
接下来封装 ensureMiniProgramSilentLogin。
区别是:
封装 ensureMiniProgramSilentLogin实现上分成三层:
两种方案的目标相同,dou是处理登录接口和业务接口之间的异步时序。
const authReady = await ensureRequestAuthReadyif { return}await requestWithToken
也就是:需要登录态的业务接口,在调用前先等待登录完成。
为什么百度不收录我的网站?害,这个问题其实hen复杂,一般来说还是内容质量和外链建设的问题,你要确保你的网站内容是有价值的,同时要Zuo好外链建设,这样才Neng提高网站的权重,从而被百度收录。
interface EnsureRequestAuthReadyOptions { ...}/** ... */export async function ensureRequestAuthReady { ...}
这样以后页面里只要调用鉴权接口,douKe以复用它。
它没有改变问题的本质,只是让“等登录完成”这件事变得geng可组合、geng好维护。
回调方案:...Promise 方案:...
对比两种方案
Promise 写法geng适合 Vue3 / TypeScript 项目,因为代码流程geng线性,也geng容易处理并发和失败状态。
进一步封装 ensureRequestAuthReadyexport interface MiniProgramSilentAuthState { ...}let silentAuthState: MiniProgramSilentAuthState | null = nulllet silentAuthReadyPromise: Promise
getSilentAuthState 和 setSilentAuthState 的作用是什么?
setSilentAuthState 用于geng新当前的静默授权状态,而 getSilentAuthState 用于获取当前的静默授权状态,这两个方法主要用于管理当前的会话状态,确保只有有效的token才会被存储和使用。
这一步的重点是 getSilentAuthState, 你要确保每次dou拿到的是Zui新的状态。
所以Ke以再封装一层 getRequestAuthToken, 用来获取当前的token。
请求拦截器是全局入口,所有接口dou会经过它。Ru果在拦截器里强制等待
login,可Neng会带来几个问题:
1. 不需要鉴权的普通
get
请求也被迫等
login
完成。
2. 多个地方同时发
get
请求,会导致重复
login。
它需要保证三个行为:
1. 小程序冷启动时
App.vue
中的
login
通常是异步执行的。
2. 页面需要
login态时自己等待,不需要
login态的页面Ke以正常渲染。
3. 多个地方同时调用
ssoLoginCheck
时只会有第一个地方真正发起
login
请求,后面的地方dou在等同一个
Promise
。
Zui终希望页面的代码只需要关注业务本身: 以一个虚构的“领取启动权益”为例。
这套方案和以前小程序里常见的
ssoLoginCheckCallbackList
思想一致,dou是让业务请求等
login
完成。
稳定处理这类问题,Ke以抓住三个点:
1. 把
login
任务变成可被全局
await
的对象。
2. 页面的鉴权动作必须等这个对象。
3. 请求拦截器只认
token,不再关心
ssoLoginCheck的结果。
以前写过一次回调版,现在让gpt5.5生成的一个Promise版
你kan,这两种写法其实dou是为了达到同一个目的,只是实现方式不同罢了。
页面真正需要的通常不是“
sso check
的结果”,而是“我现在Neng不Neng调需要
sso check 的 接口”。
小程序冷启动时 页面 接口早于 sso check完成的hen常见
它相当于 Promise 版本的全剧回调队列 :所有页面douKe以 等它,但不会互相覆盖 。
你Ke以把这种写法理解为 回调方案 的升级版。
这样既保留了 小程序回调的核心思想,也让代码geng适合 现代前端项目的 。
Zui终 页面代码 只需关注具体的业务逻辑就行了像这样:
typescript
const authReady=await ssoCheck
if{return ;}
doSthNeedSso
关键词:微信小程序、
uni-app ,
Vue,
token ,
sso,
Promise, 请求鉴权
text
sso check CallBack : login ok 后通知页继续执行业务逻辑promise : 页 onLoad 时 主动 等 ssoCheck
嗯哼,这个其实挺好理解的 ,核心就是 “谁等谁的问题 ”
1)老的 callback 写法的确有点老旧,但它的确work ,而且 “谁等谁”这件事表达得hen清楚——业务方在 callback 里继续执行业务逻辑;
2)promise 这边写法显得高大上一点 ,但本质没变 ——还是业务方主动 等待 sstcheckok再往下走;
所以说到底还是那句话:'条条大路通罗马';你怎么选dou行,关键是你得理解背后的逻辑;
综上所述,无论是哪种方式,Zui终的目的dou是为了确保在调用需要鉴权的业务接口之前,Yi经完成了sso相关的检查,这样才Neng保证整个应用流程顺畅无阻。当然在实际开发过程中,我们还需要注意hen多细节问题,比如错误处理啊、边界情况啊等等,这些dou需要我们根据具体的项目需求来进行相应的调整和优化。
只要你Neng理解其中的原理,并且Neng够灵活运用,那么无论是使用callback还是promise,douNeng够hen好地解决这个问题。
Zui后再强调一下,清晰的代码结构和良好的注释习惯对于维护大型项目来说非常重要 ;
这一点不仅体现在代码的可读性上,而且还Neng帮助团队成员geng好地理解你的设计思路,从而提高协作效率。
好了今天就聊到这里吧,希望这些内容Neng对你有所帮助!👏
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback