Есть ли разница в порядке выполнения?
Или очередь/цикл событий работает в JavaScript иначе, чем в Dart?
Есть ли разница в порядке выполнения?
Или очередь/цикл событий работает в JavaScript иначе, чем в Dart?
События DOM обрабатываются методом Blink. Поэтому эти события должны обрабатываться одинаково. В JavaScript нет другого цикла событий (на самом деле). Например, общий шаблон для выполнения — window.setTimeout(0, continuation)
.
В Dart также есть асинхронные события, которые обрабатываются dart:async
. Здесь мы можем различать моменты и циклы. Мгновение состоит из одного или нескольких циклов. Мгновение выполняет все свои циклы, пока не останется ни одного, а затем переходит к следующему мгновению. События DOM находятся на том же уровне, что и мгновения. То есть событие DOM никогда не будет чередоваться с циклами одного и того же момента. [^1] (Это также означает, что накопление циклов в одно и то же мгновение может привести к истощению DOM.)
runAsync
ставит в очередь новый цикл. Timer.run
ставит в очередь новый момент.
Futures и Streams используют циклы для постановки в очередь событий, которые могут быть выполнены немедленно. В следующем примере оба then
будут запланированы в одно и то же время и, следовательно, будут запущены до того, как какое-либо событие DOM сможет помешать.
var future = new Future.value(499);
future.then(print);
future.then(print);
Есть и другие небольшие различия между Dart и JavaScript: Dart не имеет минимального времени ожидания для Timer
прогонов. В JavaScript window.setTimeout
не разрешено выполнять вычисления раньше 5 мс. (Это связано с неудачными историческими обстоятельствами). Дарт не имеет этого ограничения. [^2]
Функциональность Timer
виртуальной машины не основана на DOM и имеет собственную реализацию. По состоянию на май 2013 года порядок запланированных обратных вызовов таймера несовместим между JavaScript (и, следовательно, dart2js) и виртуальной машиной. (Я не уверен насчет Dartium, но полагаю, что он использует версию DOM и, таким образом, похож на JavaScript).
В настоящее время мы обсуждаем изменения в библиотеке, чтобы гарантировать, что Timer
событий будут выполняться в «правильном» порядке, а не только по истечении времени ожидания.
[^1] Это неправильно реализовано. По состоянию на май 2013 года асинхронная операция строится поверх Timer
.
[^2] Это тоже еще не сделано (май 2013). Я не уверен насчет Dartium, но в настоящее время dart2js все еще использует window.setTimeout
. В конечном итоге он переключится на более новые примитивы (в браузерах, которые его поддерживают), которые позволяют устанавливать более точные тайм-ауты.