【问题标题】:Returning 'resolve' function in Javascript Promise在 Javascript Promise 中返回 'resolve' 函数
【发布时间】:2019-12-14 19:21:42
【问题描述】:

我在this blog 中找到了一段代码,它运行良好,但使用了难以理解的 Promises

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 =&gt; { begin = res; }) 是否有效?承诺通常涉及在某事上致电 resolve

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

【问题讨论】:

  • res 是一个绑定方法,可以解析(仅那个)Promise 对象。如果你真的想要,你可以取得 resolve 函数的所有权。如果您只想玩下决心,请参阅我的这个答案。 stackoverflow.com/questions/57106667/…
  • let begin: (unlock: () =&gt; void) =&gt; void = unlock =&gt; {}; 没有任何意义,该箭头函数永远不会被调用,而是会立即在 new Promise 执行程序中被覆盖。真的应该只是lock(): PromiseLike&lt;() =&gt; void&gt; { return new Promise(begin =&gt; { this.mutex = this.mutex.then(() =&gt; { return new Promise(begin); }); }); }

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


【解决方案1】:

它是一个有效的表达式吗? Promise 通常涉及在某事上调用 resolve ...

是的,它将解析函数存储在全局begin 变量中。然后当new Promise(begin)执行时,它会调用begin函数,从而解决它。

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

因为beginnew Promise 调用,带有新Promise (begin(resolve, reject)) 的resolve 函数。由于 begin 本身就是一个解析器,它会将返回的 Promise 解析为另一个 Promise 的解析器函数。

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 2023-03-11
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多