不够完美但也很能打的
1.uniapp微信小程序uni.request捕获500异常2.uniapp兼容问题3.推荐两个好玩的轻提示
4.不够完美但也很能打的
5.uniapp实现刷新页面保留参数页面不报错的情况6.关于ESLint: Delete `␍`(prettier/prettier) 错误解决方案(3种)7.loading8.关于设备像素比9.js前端去除HTML标签返回纯字符串正则/<[^>]*>/g10.Js中valueOf和toString区别和使用11.vscode关于json文件添加注释报错处理12.使用js有效括号匹配封装函数13.单项数据流和双向数据绑定的原理,区别14.CSRF(跨站请求伪造)原理:15.记录一下现网微信小程序版本ios手机极个别手机关于登录api(别的没试过)不调用的问题,其他的ios可以正常唯独极个别的ios不可以16.uniapp实现多行文本溢出超过指定行数 展开 收起17.uniapp开发抖音小程序跳转18.css滚动吸附19.promise(A).catch(f1).then(f2),f1执行后f2回执行吗,为什么20.国际化怎么做,中文一个字,阿拉伯语很长一串,怎么实现样式的一致21.页面切换保存怎么实现数据不丢失且记忆滚动条位置,常规的方案会闪一下,不如原生性能,怎么解决22.nuxtjs锁函数封装23.css样式让元素得宽度由内容撑开24.watch vs. watchEffect25.HEIC26.Intersection Observer API 是浏览器原生提供的,用于异步检测目标元素与视口或父元素是否产生交叉。它的优势在于提高性能和简化代码实现。27.backdrop-filter(纯CSS实现丝滑边框线条动画)28.js中try中定义的数据catch无法访问29.自动化脚本同步单个平台所有小程序(本质跨平台uniapp但是业务紧急,按需使用)30.前端资源提示符31.微信小程序授权弹框32.关于高度从0到auto的过渡效果33.split使用注意点34.js之连续赋值35.border和outline的区别点击查看代码
const baseUrl = 'https://wxyd.jckkan.com/index.php' //生产用
let retryCount = 1;
const maxRetry = 2; // 最大重试次数,比如设置为3
let isRefreshing = false
let requestsQueue = []
// 刷新token的函数
function refreshToken(requestUrl, method, requestData, requestHeader, resolve, reject, isPolling, callback) {
// 这里需要实现刷新token的逻辑,并在成功后执行callback
// 示例代码,具体实现需要根据实际情况调整
const app = getApp();
if (retryCount < maxRetry) {
isRefreshing = true; // 设置刷新锁
uni.login({
provider: 'toutiao', //使用微信登录
success: async (loginRes) => {
let visitorFan = await app.globalData.api.index
.getList({
bodyData: {
m: 'Api',
c: 'Public',
a: 'platformLogin',
mchid: 1,
clickid: app.globalData.clickid || ''
},
data: {
anonymous_code: loginRes.anonymousCode,
code: loginRes.code
}
})
if (visitorFan.data.code === 1) {
retryCount++; // 增加重试计数
isRefreshing = false;
let newToken = visitorFan.data.data.cookie
//全局存储用户信息
app.globalData.token = newToken
app.globalData.info = visitorFan.data.data
requestHeader['cookie'] = newToken; // 更新请求头部的token
uni.setStorageSync('yjtoken', newToken)
uni.setStorageSync('visitorInfo', visitorFan.data.data)
uni.setStorageSync('info', visitorFan.data.data)
if (callback) {
callback()
} else {
requestsQueue.forEach((queuedRequest) => {
sendRequest(queuedRequest.requestUrl, queuedRequest.method,
queuedRequest.requestData, requestHeader, queuedRequest
.resolve, queuedRequest.reject, queuedRequest.isPolling);
});
console.log('requestsQueue', requestsQueue)
requestsQueue = [];
}
} else {
// toast提示
uni.showToast({
title: visitorFan.data.msg
})
}
},
fail: () => {
reject({
message: '无法刷新token,请稍后再试'
});
}
})
} else {
retryCount = 0; // 重置重试计数
uni.showToast({
title: "多次尝试登录失败,请检查网络或联系支持",
icon: "none",
complete: () => {
reject({
message: '多次尝试登录失败,请检查网络或联系支持。'
});
}
});
// 这里可以添加提示用户重新登录的逻辑
}
}
function sendRequest(requestUrl, method, requestData, requestHeader, resolve, reject, isPolling) {
uni.request({
url: requestUrl,
method: method,
data: requestData,
header: requestHeader,
timeout: 5000,
success: (res) => {
if (res.statusCode === 200) {
// Assuming res.data is always an object when the status code is 200
switch (res.data.code) {
case 1: // Fall through
case 0:
resolve(res);
break;
case -1:
requestsQueue.push({
requestUrl,
method,
requestData,
requestHeader,
resolve,
reject,
isPolling
});
// () => {
// sendRequest(requestUrl, method, requestData, requestHeader, resolve,
// reject, isPolling);
// }
// console.log('requestsQueue', requestsQueue);
refreshToken(requestUrl, method, requestData, requestHeader, resolve, reject,
isPolling
);
break;
default:
// You could handle other codes here or reject
reject(new Error('Unknown code'));
break;
}
} else if (res.statusCode === 503) {
// let pagePreList = getCurrentPages();
// let pagePre = pagePreList[pagePreList.length - 1]['$page']['fullPath'];
// let options = pagePreList[pagePreList.length - 1]['options']
// let newOption = Object.entries(options)
// .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
// .join('&');
// let redictorUrlp = pagePre
// console.log('redictorUrlp', redictorUrlp);
uni.redirectTo({
url: `/pagesA/503/503`
})
reject(res);
} else {
uni.showToast({
title: '服务器繁忙,请稍后再试',
icon: 'none',
});
reject(res);
}
},
fail: async (error) => {
await uni.showModal({
title: '提示',
content: '网络连接超时,请稍后再试',
showCancel: false,
success: (res) => {
if (res.confirm) {
uni.reLaunch({
url: '/pages/index/index'
})
}
}
});
reject(error);
},
complete: () => {
if (!isPolling) {
uni.hideLoading({
fail: () => {},
complete: (hide) => {}
});
}
}
});
}
export default function request(url, {
data = {},
bodyData = false,
header = {},
}, type = 'get', isPolling) {
const app = getApp();
// 公共header 本地存有并且不是登录模块
let tokens = uni.getStorageSync('yjtoken')
header['cookie'] = tokens
// header['cookie'] = app.globalData.token || tokens
// console.log('请求数据', url, data, 'header', header)
// json数据同事传bodyData
let bodyUrl = '';
if (bodyData) {
for (let key in bodyData) {
bodyUrl += `${key}=${bodyData[key]}&`
}
}
const requestUrl = baseUrl + url + (bodyUrl ? '?' + bodyUrl : '');
const method = type.toUpperCase();
if (!isPolling) {
uni.showLoading({
title: "加载中",
mask: true
});
}
return new Promise((resolve, reject) => {
sendRequest(requestUrl, method, data, header, resolve, reject, isPolling);
})
}
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/articles/18143648
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)