async-lock的大概npm地址https://www.npmjs.com/package...为什么要async-lock?因为我看到它的下载量比较大(是我找到的所有同类库中最大的),而且最近的更新时间也比较近。场景是在一个异步函数中,由于异步操作的存在,这个函数的A和B的两次执行会导致不可控的结束序列。即A先执行,但比B晚退出该函数。对于数据库操作,有时会在一系列业务变化后将select的值更新到数据库中。比如一个简单的计数器从0开始计数,假设由于业务原因,代码中必须进行+1操作。然后A读取数据库,进入异步执行。这时B也开始执行读取数据库的代码,最终导致执行两次后计数器只加1。这时候就需要一个锁机制,类似于Java中的synchronized或者lock。在执行同一段代码的时候,添加相同的key,如果发现key正在被使用,就直接放入这个key要执行的数组中。async-lock原理AsyncLock类:queues:用于存放所有要执行的函数,格式为:{key:[function,function]}acquire(key,fn):key:需要加锁的名字,即,keyfninqueues:是要执行的函数。操作是将fn添加到queues[key]对应的数组中。如果队列没有这个key字段,则设置起始值为[],直接执行。当key对应的函数执行时,会检查queues中对应的key-value数组是否为空,如果为空则执行deletequeues[key],否则继续执行下一个要执行的函数。省略其余的使用细节。问题这种方法最大的问题是只能在单进程中运行,除非能保证同一个key总能赋值给同一个进程。
