为什么在 Backbone 的设置方法中有一个 while 循环

Why there is a while loop in Backbone's set method?

本文关键字:有一个 while 循环 方法 设置 Backbone 为什么      更新时间:2023-09-26

Github源代码

下面是 Backbone 的 set 方法的片段:

set: function(key, val, options) {
  var attr, attrs, unset, changes, silent, changing, prev, current;
  ...
  options || (options = {});
  ...
  // Trigger all relevant attribute changes.
  if (!silent) {
    if (changes.length) this._pending = options;
    for (var i = 0, length = changes.length; i < length; i++) {
      this.trigger('change:' + changes[i], this, current[changes[i]], options);
    }
  }
  // You might be wondering why there's a `while` loop here. Changes can
  // be recursively nested within `"change"` events.
  if (changing) return this;
  if (!silent) {
    while (this._pending) {
      options = this._pending;
      this._pending = false;
      this.trigger('change', this, options);
    }
  }
  this._pending = false;
  this._changing = false;
  return this;
}

尽管评论确实提到了我想知道的while循环,但我看不出这个while循环是如何工作的,因为局部变量changing将始终在一轮settrue

谁能向我解释为什么会有一段时间以及何时生效?

提前感谢!

正如注释所说,"更改可以递归嵌套在"change"事件中。

当触发"change"事件(也称为再次调用set)时,更新或重新设置模型上的某些属性并不是取消注释。_pending属性只是为了确保在"change"上更新的所有属性实际上都已更改。

看起来他们曾经检查是否有其他更改,以及是否有用于仅触发 1 个更改事件的骨干。这样做的问题是,如果有一个更新多个属性的更改事件的侦听器,则不会调用所有set函数。有关具体示例,请参阅此单元测试。因此,while 循环处理的是 1 个侦听器多次调用set的边缘情况,而不是多个侦听器,每个侦听器调用set一次。就像上面链接的测试中的这个:

model.on('change:a', function() {
  model.set({b: true});
  model.set({b: true});
});

如果您对他们为什么将this._pending更改为选项感到困惑,请查看此问题以及相关的拉取请求

相关文章: