【问题标题】:In @angular's source code, why does NgForm use an already resolved promise in its functions?在 @angular 的源代码中,为什么 NgForm 在其函数中使用已经解析的 promise?
【发布时间】:2017-01-14 22:22:21
【问题描述】:

我已经开始阅读@angular 源代码,部分是为了学习,部分是因为某些文档似乎缺少一些东西。在表单指令中,我遇到过这样的代码块:

const resolvedPromise = Promise.resolve(null);
...
export class NgForm extends ControlContainer implements Form {
  ...
  addControl(dir: NgModel): void {
    resolvedPromise.then(() => {
      ...
    });
  }
}

这个具体的例子来自ng_form,这个模式在这个文件中重复出现。使用 this 的每个函数都没有返回值,我认为这是相关的。

使用这个resolvedPromise 的目的是什么?我的理解是,由于在调用此函数之前已经完成了resolvedPromise,因此提供给then 函数的回调将立即执行。在这种情况下,为什么还要使用 Promise?

【问题讨论】:

    标签: angular promise


    【解决方案1】:

    .then() 异步执行代码,但调度为微任务而不是事件队列中的新任务。

    请参阅https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ 示例以了解差异。

    在当前事件完成并处理下一个事件之前,不仅是当前事件处理程序,微任务队列也需要处理完。

    这种方式可以异步执行代码,而不会干扰其他事件处理程序并导致竞争条件。

    【讨论】:

      【解决方案2】:

      我猜是因为变化检测。

      他们说 NgZone 已经修补了浏览器中的所有异步功能。

      这意味着 Promise 也被修补了,这意味着当 promise 被解决时,Angular 将运行一个更改检测周期。

      我想这是他们确保 addControl 函数连接到 NgZone 中的方法,因此无需手动检测更改。

      我可能是错的,需要调查一下:P

      【讨论】:

        【解决方案3】:

        他们正在强制运行额外的更改检测以确保正确传播更改。请参阅NgModel 的评论部分。

        【讨论】:

          【解决方案4】:

          你的理解是绝对正确的,当它到达那些使用“resolvedPromise”的函数时,这个承诺已经被解决了。只是为了从MDN刷新Promise.Resolve的概念:

          Promise.resolve(value) 方法返回一个 Promise 对象,该对象是 用给定的值解决。如果该值是 thenable(即具有 “then” 方法),返回的 promise 将“跟随”那个 thenable, 采用其最终状态;否则返回的承诺将是 实现了价值。

          那么为什么要在这种情况下使用 Promise 呢?仅仅是因为当您想要进行异步操作时,您会采用这种方法,您可以提前知道没有什么要解决的。希望对您有所帮助。

          【讨论】:

            猜你喜欢
            • 2019-06-24
            • 1970-01-01
            • 1970-01-01
            • 2018-02-13
            • 1970-01-01
            • 2017-08-11
            • 2015-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多