針對小程序的異步
因?yàn)閼械萌ヅ渲胊sync 和await的環(huán)境了匆光,wx.getStorageSync是同步的就
直接了在這個基礎(chǔ)上了一個重入鎖的js來實(shí)現(xiàn)同步
/***本類主要用來實(shí)現(xiàn)同步*/
const lockerKey = "wxlocker";
var lockerContainer={};
/**
* 加鎖函數(shù)
* 參數(shù):鎖名
*
*/
function lock(lockName){
var obj= wx.getStorageSync(lockerKey);
console.log(111);
console.log(obj);
if (typeof obj === "undefined" || obj==null||obj==''){
? lockerContainer.lockName = 1;
? wx.setStorageSync(lockerKey, lockerContainer);
}else{
? lockerContainer = obj;
? if (typeof lockerContainer.lockName !== "undefined" && lockerContainer.lockName != null && lockerContainer.lockName != ''){
? ? lockerContainer.lockName = lockerContainer.lockName +1;
? }else{
? ? lockerContainer.lockName = 1;
? }
? //更新鎖
? wx.setStorageSync(lockerKey, lockerContainer);
}
}
/**
* 解鎖函數(shù)
* 參數(shù):鎖名
*
*/
function unlock(lockName){
? var obj = wx.getStorageSync(lockerKey);
? console.log(222);
? console.log(obj);
? if (typeof obj === "undefined" || obj == null || obj == '') {//沒有鎖過
? ? return;
? } else {
? ? lockerContainer = obj;
? ? if (typeof lockerContainer.lockName !== "undefined" && lockerContainer.lockName != null && lockerContainer.lockName != '') {
? ? ? if (lockerContainer.lockName <=0){
? ? ? ? lockerContainer.lockName=0;
? ? ? ? return;
? ? ? }else{
? ? ? ? lockerContainer.lockName = lockerContainer.lockName - 1;
? ? ? }
? ? } else {
? ? ? return;
? ? }
? ? //更新鎖
? ? wx.setStorageSync(lockerKey, lockerContainer);
? ? obj = wx.getStorageSync(lockerKey);
? ? console.log(obj);
? }
}
/**
* 是否被鎖函數(shù)
* 參數(shù):鎖名
* 返回值:boolean
*/
function isLockedBy(lockName){
? var obj = wx.getStorageSync(lockerKey);
? if (typeof obj === "undefined" || obj == null || obj == '') {//沒有鎖過
? ? return false;
? } else {
? ? lockerContainer = obj;
? ? if (typeof lockerContainer.lockName !== "undefined" && lockerContainer.lockName != null && lockerContainer.lockName != '') {
? ? ? if (lockerContainer.lockName > 0) {
? ? ? ? return true;
? ? ? } else {
? ? ? ? return false;
? ? ? }
? ? } else {
? ? ? return false;
? ? }
? }
}
/**
* 等待函數(shù)(等待100*millseconds后自動解除)
* 參數(shù):鎖名,間隔毫秒鞭达,等待解鎖完成后的回調(diào)函數(shù)
*
*/
function wait(lockName, millseconds,callback){
? //100次監(jiān)控后清空鎖
? var expireTime = 0;
? var timer =setInterval(function () {
? ? console.log("wait " + millseconds);
? ? if (!isLockedBy(lockName)){
? ? ? clearInterval(timer);
? ? ? callback();
? ? }else{//被鎖住了
? ? ? expireTime++;
? ? ? if (expireTime > 100) {
? ? ? ? lockerContainer.lockName=null;
? ? ? ? //清空鎖
? ? ? ? wx.setStorageSync(lockerKey, lockerContainer);
? ? ? ? clearInterval(timer);
? ? ? }
? ? }
? }, millseconds)
}
module.exports = {
? wait: wait,
? unlock: unlock,
? lock: lock
}
用法,加鎖多少次就要解鎖多少次
lock("mylock")
lock("mylock")
unlock("mylock")
unlock("mylock")
wait("mylock",1000,callback)