导读:本期聚焦于小伙伴创作的《微信小程序接口请求管理:未登录和登录后异步请求处理逻辑与实现方案》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《微信小程序接口请求管理:未登录和登录后异步请求处理逻辑与实现方案》有用,将其分享出去将是对创作者最好的鼓励。

微信小程序接口调用:未登录和登录后如何正确处理异步请求

在微信小程序开发过程中,接口请求的处理是核心功能之一,尤其是涉及用户登录状态的场景。未登录状态下发起某些需要鉴权的接口请求,或者登录完成后需要补发之前被拦截的请求,都需要合理的异步请求管理方案。本文将详细介绍未登录和登录后异步请求的处理逻辑与实现方法。

核心场景分析

实际开发中常见的两类场景需要重点处理:

  • 用户在未登录状态下发起需要登录权限的接口请求,此时需要暂时缓存请求,引导用户登录后再重新执行

  • 用户登录完成获取凭证后,需要自动处理之前缓存的待执行请求,同时保证后续请求的鉴权信息正确携带

基础请求封装

首先我们需要对微信小程序的wx.request进行封装,统一处理请求头、错误处理等逻辑,为后续处理登录状态相关逻辑打好基础。

// utils/request.js
const baseUrl = 'https://www.ipipp.com/api'

// 存储待执行的请求队列
let waitRequestQueue = []
// 是否正在登录中,避免重复触发登录逻辑
let isLoginning = false

/**
 * 基础请求方法
 * @param {Object} options 请求配置
 * @returns {Promise} 请求结果的Promise
 */
const request = (options) => {
  return new Promise((resolve, reject) => {
    const token = wx.getStorageSync('token')
    const header = {
      'Content-Type': 'application/json',
      ...options.header
    }
    // 如果有token则携带鉴权头
    if (token) {
      header['Authorization'] = `Bearer ${token}`
    }
    wx.request({
      url: `${baseUrl}${options.url}`,
      method: options.method || 'GET',
      data: options.data || {},
      header,
      success: (res) => {
        // 401状态码表示未登录或token失效
        if (res.statusCode === 401) {
          // 将当前请求加入等待队列
          return enqueueRequest(options, resolve, reject)
        }
        if (res.statusCode === 200) {
          resolve(res.data)
        } else {
          reject(res.data)
        }
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

export default request

未登录状态请求处理

当接口返回401未授权状态时,说明用户未登录或者登录凭证失效,此时需要将当前请求暂存到队列中,同时触发登录流程。

// 将请求加入等待队列,并触发登录
const enqueueRequest = (options, resolve, reject) => {
  // 将请求的resolve和reject也存入队列,后续登录完成后直接调用
  waitRequestQueue.push({
    options,
    resolve,
    reject
  })
  // 如果已经在登录中,不需要重复触发登录
  if (!isLoginning) {
    isLoginning = true
    doLogin()
  }
}

登录流程实现

微信小程序登录需要通过wx.login获取临时code,再调用后端登录接口换取登录凭证(token),登录完成后处理之前缓存的请求队列。

// 执行登录逻辑
const doLogin = () => {
  wx.login({
    success: (loginRes) => {
      if (loginRes.code) {
        // 调用后端登录接口,这里的接口地址使用示例域名
        wx.request({
          url: 'https://www.ipipp.com/api/login',
          method: 'POST',
          data: {
            code: loginRes.code
          },
          success: (res) => {
            if (res.statusCode === 200) {
              const token = res.data.token
              // 存储token到本地
              wx.setStorageSync('token', token)
              // 登录完成,处理等待队列中的请求
              processQueue()
            } else {
              // 登录失败,拒绝所有等待的请求
              processQueue(new Error('登录失败'))
            }
          },
          fail: (err) => {
            processQueue(err)
          },
          complete: () => {
            isLoginning = false
          }
        })
      } else {
        isLoginning = false
        processQueue(new Error('获取登录code失败'))
      }
    },
    fail: () => {
      isLoginning = false
      processQueue(new Error('登录接口调用失败'))
    }
  })
}

登录后队列请求处理

登录成功或失败后,需要对之前缓存的请求队列执行对应操作:登录成功则重新发起所有缓存的请求,登录失败则统一返回错误。

// 处理等待队列
const processQueue = (error) => {
  // 遍历队列中的所有请求
  waitRequestQueue.forEach((item) => {
    if (error) {
      // 如果有错误,直接reject请求
      item.reject(error)
    } else {
      // 重新发起请求,将结果传给之前的resolve
      request(item.options).then(item.resolve).catch(item.reject)
    }
  })
  // 清空队列
  waitRequestQueue = []
}

使用示例

封装完成后,业务层中调用请求的方式和正常请求一致,不需要额外处理登录逻辑,框架会自动处理未登录场景的请求缓存和重新执行。

// pages/index/index.js
import request from '../../utils/request'

Page({
  getUserInfo() {
    request({
      url: '/user/info',
      method: 'GET'
    }).then((res) => {
      console.log('用户信息:', res)
    }).catch((err) => {
      console.error('获取用户信息失败:', err)
    })
  }
})

注意事项

  • 登录状态判断需要根据后端接口的实际返回状态码调整,不一定是401,部分后端可能返回200但业务码标识未登录

  • 本地存储的token需要设置过期时间,过期后需要主动触发重新登录逻辑

  • 如果同时发起多个需要登录的请求,队列机制可以避免重复触发多次登录流程,提升用户体验

  • 对于不需要登录的公共接口,可以在请求封装中增加白名单配置,跳过401状态的处理

微信小程序 异步请求 登录状态管理 请求队列 接口调用

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。