js实现“锁”

JavaScript09

js实现“锁”,第1张

在js中需要让某些异步的任务按顺序执行的时候可以Promise.then(Promise).then.....

但是有时候任务不是固定的,无法按照这种固定的模式写下去,需要其他的实现

这是ES6 async,await版本的,借助Promise的resolve,当前面的异步事件执行完后,会调用后面任务的resolve,后面的会执行。

纯Promise的也好实现,不过需要各种回调。

1、 JS 没有变量锁

2、 JS 是单线程的,但是 setTimeout 或者 setInterval 会导致异步执行

3、 HTML 的标签里,<script defer>也可以导致脚本异步执行

4、 NodeJS 里,很多函数都是异步的

记得不要将异步和多线程混淆起来。

如果查不到原因,请上代码。

以上,请采纳,请给分。

针对小程序的异步

因为懒得去配置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)