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