在Javascript Promise中返回'resolve'函数

时间:2019-08-07 07:58:27

标签: javascript ecmascript-6 promise async-await es6-promise

我在this blog中发现了一段代码,可以很好地工作,但是却使用了难以理解的Promise。

export class Mutex {
  private mutex = Promise.resolve();

  lock(): PromiseLike<() => void> {
    let begin: (unlock: () => void) => void = unlock => {};

    this.mutex = this.mutex.then(() => {
      return new Promise(begin);
    });

    return new Promise(res => {
      begin = res;
    });
  }

  async dispatch(fn: (() => T) | (() => PromiseLike<T>)): Promise<T> {
    const unlock = await this.lock();
    try {
      return await Promise.resolve(fn());
    } finally {
      unlock();
    }
  }
}
  • 表达式new Promise(res => { begin = res; })是否有效?承诺通常涉及在某事上致电resolve

  • const unlock = await this.lock();为什么解析为函数?

1 个答案:

答案 0 :(得分:3)

  

这是一个有效的表达式吗?承诺通常涉及对某事进行解决...

是的,它将resolve函数存储在全局begin变量中。然后,在执行new Promise(begin)时,它将调用begin函数并对其进行解析。

  

为什么const unlock =等待this.lock();解决功能?

因为begin被该新Promise(new Promise)的resolve函数所调用,因此begin(resolve, reject)被调用。因为begin是解析器本身,它将解析返回的Promise到另一个promise的resolver函数。