В моем проекте 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
pme 16 Май 2018 в 10:09

1 ответ

Лучший ответ

Можешь попробовать:

@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

4
pme 16 Май 2018 в 07:50