我开始阅读@angular源代码,部分是为了学习,部分是因为有些文档似乎缺少了东西。在表单指令中,我遇到了这样的代码块:
const resolvedPromise = Promise.resolve(null);
...
export class NgForm extends ControlContainer implements Form {
...
addControl(dir: NgModel): void {
resolvedPromise.then(() => {
...
});
}
}
此具体示例来自ng_form,此模式在整个文件中重复出现。使用它的每个函数都没有返回值,我认为这是相关的。
使用此resolvePromise的目的是什么?我的理解是,由于已经在调用此函数之前已完成resolvePromise,因此将立即执行提供给then
函数的回调。在这种情况下,为什么还要使用Promise?
答案 0 :(得分:2)
.then()
执行代码异步,但调度为微任务而不是事件队列中的新任务。
请参阅示例https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/以了解差异。
在当前事件完成并处理下一个事件之前,不仅要处理当前事件处理程序,还需要完全处理微任务队列。
这样,代码可以在没有其他事件处理程序干扰并导致竞争条件的情况下执行异步。
答案 1 :(得分:0)
我想这是因为变化检测。
他们说NgZone修补了浏览器中的所有异步功能。
这意味着Promise也会被修补,这意味着当promise得到解决时,angular会运行一个更改检测周期。
我想这是他们确保例如在NgZone中连接addControl函数的方式,因此无需手动检测更改。
我可能错了,需要一些调查:P
答案 2 :(得分:0)
他们正在强制执行其他更改检测运行,以确保更改已正确传播。请参阅NgModel
的评论部分。
答案 3 :(得分:0)
您的理解绝对正确,当这个承诺到达那些使用“resolvedPromise”的函数时,它已经被解决了。只是为了从MDN:
刷新Promise.Resolve的概念Promise.resolve(value)方法返回一个Promise对象 用给定的值解决。如果该值是可以的(即具有a “然后”方法),返回的承诺将“跟随”那个, 采用其最终状态;否则返回的承诺将是 实现了价值。
那么为什么在这种情况下使用Promise呢?仅仅因为当你想要进行异步操作时,你会采用这种方法,事先你就知道没有什么可以解决的。希望有所帮助。