我在一些 typescript 代码中看到了这个变异obersver,我不知道这个承诺是如何工作的,我以前从未见过这种风格的没有参数的承诺:
const observer = new MutationObserver((mutations: MutationRecord[]) => {
Promise.resolve().then(someNextMethod)
this.somethingThatTakesAWhile()
})
observer.observe(HTMLtarget)
当观察被触发时,someNextMethod
在this.somethingThatTakesAWhile()
运行之后运行。在这种情况下这是怎么可能的?我不明白Promise是如何传递任何参数的,也不知道在这种情况下如何解决。有人能解释一下这段代码的内部机制吗?我有点不知道它是如何按照这个顺序运行的。谢谢!
2条答案
按热度按时间e5nqia271#
这一点:
相当于:
反向工作相当于:
内联定义函数和指向函数只是语法上的区别,所有通过
then
传递的参数都会传递给被引用的函数,但在本例中,没有任何参数,因为它是一个返回值为空的承诺。换句话说,这个方法不需要任何参数,在这个例子中,它实际上只是一个老的JS技巧,让代码在调用栈的末尾运行。
xfyts7mz2#
像这样的事情的要点是:
只是在当前执行链结束后调用
someNextMethod()
,在浏览器中类似于:尽管如果其它事情在事件队列中等待,则
Promise.resolve()
方法将比setTimeout()
更快地优先化它。所以,在你的例子中,这两句话的重点是:
是在
this.somethingThatTakesAWhile()
返回之后和MutationObserver
回调已经返回之后调用someNextMethod()
,从而允许在调用someNextMethod()
之前也通知任何其他观察者。至于为什么稍后调用
someNextMethod()
,这是因为所有.then()
处理程序在当前执行线程完成(并将控制返回给事件循环)之前运行,即使它们所附加的承诺已经解决,这就是.then()
的工作原理,根据Promise规范。为什么有人会这样做是上下文相关的,因为这都只是伪代码,你没有提供任何线索,以真实的的动机在这里。