轮询函数的主要目的是等待特定条件的发生,通过轮询的方式检查条件是否已经满足。它接受一个配置对象作为参数,可以设置轮询的间隔、次数、轮询字段等。函数会返回一个 Promise 对象,可以通过 .then() 和 .catch() 处理轮询的结果。
function polling(config) {
// 默认配置
const defaultConfig = {
time: 200, // 轮询间隔
times: 30, // 轮询次数
key: "", // 轮询字段
reKey: "",
that: null
}
// 合并默认配置和传入的配置参数
const mergedConfig = { ...defaultConfig, ...config };
let t = 0;
// 返回一个 Promise 对象,用于处理轮询结果
return new Promise((resolve, reject) => {
const f = () => {
if (mergedConfig.reKey && wx.getStorageSync(mergedConfig.reKey)) {
// 如果存在 reKey,并且存储中有与之对应的值,就解析为 false 并结束轮询
resolve(false);
return;
}
t++;
if (t >= mergedConfig.times) {
// 如果达到最大轮询次数仍未满足条件,就拒绝 Promise
reject();
return;
} else if ((mergedConfig.that && mergedConfig.that.data[mergedConfig.key]) || wx.getStorageSync(mergedConfig.key)) {
// 如果满足条件,就解析为 true 并结束轮询
resolve(true);
return;
} else {
// 否则,等待指定时间后再次执行轮询
setTimeout(f, mergedConfig.time);
}
};
// 初始执行轮询函数
f();
});
}
f() 函数是一个用于轮询操作的递归函数,它根据不同的条件来决定是继续轮询,提前结束轮询,还是拒绝轮询。这个函数的执行过程会根据条件的满足与否而不断地递归执行,直到满足了特定的条件或达到最大轮询次数为止。
使用场景:
例如在小程序页面生命周期中onShow 需要调用接口,但是由于需要小程序生命周期onLaunch中向后端请求token,因为请求token接口没有返回,此时调用其他接口必将失败,此时我们可以
/**
* 生命周期函数--监听页面显示
*/
async onShow() {
await polling('Authorization')
// TODO ... 这里可以做其他请求操作,保证在请求之前,taken接口一定有返回了。
},