typescript 这个没有论证的承诺在这个突变观察者身上是如何起作用的呢?

7gcisfzg  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(97)

我在一些 typescript 代码中看到了这个变异obersver,我不知道这个承诺是如何工作的,我以前从未见过这种风格的没有参数的承诺:

const observer = new MutationObserver((mutations: MutationRecord[]) => {
    Promise.resolve().then(someNextMethod)
    this.somethingThatTakesAWhile()
  })

  observer.observe(HTMLtarget)

当观察被触发时,someNextMethodthis.somethingThatTakesAWhile()运行之后运行。在这种情况下这是怎么可能的?我不明白Promise是如何传递任何参数的,也不知道在这种情况下如何解决。有人能解释一下这段代码的内部机制吗?我有点不知道它是如何按照这个顺序运行的。谢谢!

e5nqia27

e5nqia271#

这一点:

Promise.resolve().then(someNextMethod)

相当于:

Promise.resolve().then(() => someNextMethod())

反向工作相当于:

const myNewMethod = () => someNextMethod()
Promise.resolve().then(myNewMethod)

内联定义函数和指向函数只是语法上的区别,所有通过then传递的参数都会传递给被引用的函数,但在本例中,没有任何参数,因为它是一个返回值为空的承诺。
换句话说,这个方法不需要任何参数,在这个例子中,它实际上只是一个老的JS技巧,让代码在调用栈的末尾运行。

xfyts7mz

xfyts7mz2#

像这样的事情的要点是:

Promise.resolve().then(someNextMethod)

只是在当前执行链结束后调用someNextMethod(),在浏览器中类似于:

setTimeout(someNextMethod, 0);

尽管如果其它事情在事件队列中等待,则Promise.resolve()方法将比setTimeout()更快地优先化它。
所以,在你的例子中,这两句话的重点是:

Promise.resolve().then(someNextMethod)
this.somethingThatTakesAWhile()

是在this.somethingThatTakesAWhile()返回之后和MutationObserver回调已经返回之后调用someNextMethod(),从而允许在调用someNextMethod()之前也通知任何其他观察者。
至于为什么稍后调用someNextMethod(),这是因为所有.then()处理程序在当前执行线程完成(并将控制返回给事件循环)之前运行,即使它们所附加的承诺已经解决,这就是.then()的工作原理,根据Promise规范。
为什么有人会这样做是上下文相关的,因为这都只是伪代码,你没有提供任何线索,以真实的的动机在这里。

相关问题