为何Mutex的lock()方法返回的Promise会解析为unlock函数?
问题
在Mutex类的dispatch方法中,unlock被赋值为await this.lock()的结果。但看起来lock()返回的Promise并未显式解析为任何值,只是执行了begin = res,为何unlock最终是一个函数?
解答
要搞懂这个问题,得一步步拆解lock()函数的执行逻辑:
初始化与变量赋值
lock函数开头先声明了begin变量,初始是个空函数。接着更新实例的mutex属性:它会等待之前的mutex状态完成后,创建一个新的Promise,这个Promise的执行器暂时是初始的空begin函数。返回Promise并绑定resolve
lock函数最后返回一个新的Promise,这个Promise的resolve方法被赋值给了begin变量——这是核心转折点,此时begin不再是空函数,而是这个返回Promise的resolve方法。异步流程中的值传递
当之前的mutex完成后,this.mutex.then里的回调会执行,此时创建new Promise(begin)。而Promise的执行器函数会被自动传入当前新Promise的resolve和reject方法。因为此时
begin已经是lock返回的那个Promise的resolve方法,所以调用begin(resolve)就相当于把lock返回的Promise的解析值设置为这个resolve方法——也就是我们最终拿到的unlock函数。unlock的作用
当调用unlock()时,本质是调用了这个内部Promise的resolve方法,让this.mutex的状态变为resolved,这样下一个等待获取锁的请求就能进入临界区执行。
内容的提问来源于stack exchange,提问作者Tien Phan

