Чем отличается очередь событий/цикл событий в Dart между Dart2JS и Dart VM?

Есть ли разница в порядке выполнения?

Или очередь/цикл событий работает в JavaScript иначе, чем в Dart?


person Juniper Belmont    schedule 20.04.2013    source источник
comment
не совсем определенный ответ, но в любом случае он может быть полезен: dart2js стремится поддерживать согласованное поведение, поэтому он вообще не должен работать по-другому. НО, баги случаются.   -  person MarioP    schedule 22.04.2013


Ответы (1)


События 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. В конечном итоге он переключится на более новые примитивы (в браузерах, которые его поддерживают), которые позволяют устанавливать более точные тайм-ауты.

person Florian Loitsch    schedule 03.05.2013
comment
На Dartlang.org теперь есть статья с подробным описанием событийных циклов и микрозадач: dartlang.org /статьи/цикл событий - person Florian Loitsch; 09.11.2013