美文网首页
小程序里面的锁的代码

小程序里面的锁的代码

作者: 四脚蛇 | 来源:发表于2018-07-10 12:28 被阅读0次

针对小程序的异步

因为懒得去配置async 和await的环境了,wx.getStorageSync是同步的就

直接了在这个基础上了一个重入锁的js来实现同步

/***本类主要用来实现同步*/

const lockerKey = "wxlocker";

var lockerContainer={};

/**

* 加锁函数

* 参数:锁名

*

*/

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);

}

}

/**

* 解锁函数

* 参数:锁名

*

*/

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);

  }

}

/**

* 是否被锁函数

* 参数:锁名

* 返回值: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;

    }

  }

}

/**

* 等待函数(等待100*millseconds后自动解除)

* 参数:锁名,间隔毫秒,等待解锁完成后的回调函数

*

*/

function wait(lockName, millseconds,callback){

  //100次监控后清空锁

  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)

相关文章

  • 小程序里面的锁的代码

    针对小程序的异步 因为懒得去配置async 和await的环境了,wx.getStorageSync是同步的就 直...

  • happens-before规则内容

    1、程序次序原则:一个线程内,按照程序代码顺序,书写在前面的操作先行发生与书写在后面的操作。 2、监视器锁规则:一...

  • Go基础知识

    1、小程序“hello world” 下面的代码可能是你遇到的最简单的GO程序: // helloworld.go...

  • ReentrantReadWriteLock源码解析

    ReentrantReadWriteLock编码示例 上面的代码展示读写锁的使用,读写锁的介绍参考Java锁[ht...

  • 小程序里面h5缓存问题

    原生小程序代码更新可以通过删除小程序来清除缓存,如果不手动清除,官方给出的解释是24小时内会更新内嵌在小程序里面的...

  • 从一个小程序跳到另一个小程序

    本小程序代码: 还需要在本小程序app.json里声明要跳转到的小程序的appid 另一个小程序接收数据: 使用限...

  • 悬浮按钮滚动时隐藏不滚动显示

    小程序里添加滚动并监听滚动事件 wxml 代码 wxss 代码 js 代码 web页面实现方法 html代码 cs...

  • 小程序文档知识点链接总结

    小程序开发教程 1.小程序代码构成代码结构 2.小程序由逻辑层和渲染层构成 小程序框架 小程序开发框架的目标是通过...

  • 微信配置项、生命周期函数

    小程序配置 app.json pages里是配置的文件的路径 window里定义小程序所有页面的顶部背景颜色,文字...

  • 小程序网络请求之模块封装

    做商城,音乐,新闻类的小程序的时候,我们希望用户能够清楚全面的获取到足够多的信息。我们可以在小程序的代码中写入数据...

网友评论

      本文标题:小程序里面的锁的代码

      本文链接:https://www.haomeiwen.com/subject/gpyfpftx.html