2013-04-20 2 views
3

Есть ли разница в порядке выполнения?В Dart, как циклы событий/событий различаются между Dart2JS и Dart VM?

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

+0

не совсем определенный ответ, но в любом случае это может быть полезно: dart2js направлен на то, чтобы поведение было согласованным, поэтому оно не должно работать иначе. НО, ошибки происходят. – MarioP

ответ

4

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

+0

В Dartlang.org теперь есть статья, в которой перечислены детали циклов событий и микротоков: https://www.dartlang.org/articles/event-loop/ –

Смежные вопросы