Полимер: когда использовать асинхронный?
Какова цель async
метод в полимере? Когда я должен использовать это?
Прямо сейчас я использую это как hm-this-bug-is-своего рода-странно-возможно-async-будет-исправить-это-yep-id-did-yey. Это не дает мне уверенности в моем коде, так как я кроплю async
только когда появляется какая-то временная ошибка.
1 ответ
Ответ здесь немного отличается в зависимости от того, используете ли вы Polymer 0.5 или 1.0. В 1.0 больше операций выполняется синхронно, так что вы можете не видеть такой большой потребности в асинхронности (также, асинхронный метод работает немного иначе в 1.0).
Давайте начнем с 0,5. Большинство случаев связано с эффектами изменения свойств. Свойства, используемые в привязках данных или наблюдателях, наблюдаются за изменениями. Когда вы изменяете одно из этих свойств, любые побочные эффекты этого изменения происходят асинхронно с синхронизацией между микрозадачами. Это означает, что работа происходит после возврата текущего обработчика события, но до обработки следующего события.
Другими словами, если у меня есть привязка данных, как это:
<div id="output">{{someProperty}}</div>
Предположим, у меня есть следующий код:
this.someProperty = "New Value";
console.log(this.$.output.textContent); // logs "Old Value"
Это где асинхронность кусает вас. Если вы хотите, чтобы связанные данные обновлялись, вам нужно дать системе привязки данных возможность работать. Если вы переместите это console.log
оператор в асинхронном режиме, поэтому он выполняется позже, вы получите ожидаемый ответ:
this.async(function() {
console.log(this.$.output.textContent); // logs "New Value"
});
В большинстве случаев вам не нужно тыкать в связанные с данными элементы DOM. Но в том случае, если вы это делаете или ожидаете побочного эффекта от наблюдателя, вам, вероятно, понадобится асинхронность.
В Polymer 1.0 привязка данных и наблюдатели с одним свойством являются синхронными. Наблюдатели с несколькими свойствами и некоторые операции DOM являются асинхронными.
(Хотя API отличаются от JavaScript, эта статья Dart о цикле событий - лучшая, которую я нашел для описания цикла событий и очереди микрозадач: https://www.dartlang.org/articles/event-loop/)