Binding.scala: стратегия, позволяющая избежать слишком большого количества обновлений доменного дерева - PullRequest
0 голосов
/ 16 мая 2018

В моем проекте scala-adapters Я отображаю записи журнала, которые отправляются через веб-сокет.

Поскольку я не контролирую, сколько записей отправлено, я ищу стратегию, чтобы экран не зависал.

Я создал ScalaFiddle для имитации этого: https://scalafiddle.io/sf/kzr28tq

Эта функция с этими параметрами отлично работает:

setInterval(1000) { // note the absence of () =>
  entries.value += (0 to 100).map(_.toString).mkString("")
}

Если интервал становится меньше, а строка длиннее - экран зависает, например, с:

setInterval(100) { // note the absence of () =>
  entries.value += (0 to 10000).map(_.toString).mkString("")
}

Есть ли решение, чтобы решить это на стороне клиента - или мне нужно решить это на стороне сервера?

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете попробовать:

@dom
def render = {
  <div>
  {
    for (entry <- entries) yield {
      entryDiv(entry).bind
    }
  }
  </div>
}

Проблема в том, что вы связываете записи слишком рано.Binding.scala делает свое волшебство с помощью преобразования CPS, каждый .bind запускает переоценку всего кода после, поэтому вам следует связать переменную как можно позже.

А для Vars используйте вместо этого для пониманиясвязать напрямую, чтобы избежать обновления всего списка.Когда вы используете += для изменения содержимого Vars, Binding.scala «исправляет» список внутренне, но если вы сделаете .bind в экземпляре Vars напрямую, чтобы получить весь список, каркас не сможет ничего сделатьоптимизация для вас.

Вот обновленная ScalaFiddle: https://scalafiddle.io/sf/kzr28tq/3

...