聚合物中async
方法的目的是什么?我应该什么时候使用它?
现在我正在使用它像 hm-this-bug-is-kinda-strange-maybe-async-will-fix-it-yep-id-did-yey 。它并没有让我对我的代码有任何信心,因为当我出现一些时间错误时,我正在点async
。
答案 0 :(得分:11)
这里的答案略有不同,具体取决于您是否使用Polymer 0.5或1.0。在1.0中,更多操作是同步的,因此您可能看不到异步的需求(同样,async method works slightly differently in 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中,数据绑定和单属性观察器是同步的。多属性观察者和some DOM operations是异步的。
(虽然API与JavaScript不同,但这篇关于事件循环的Dart文章是我发现的描述事件循环和微任务队列的最佳文章:https://www.dartlang.org/articles/event-loop/)