聚合物:何时使用异步?

时间:2015-05-06 15:30:33

标签: polymer

聚合物中async方法的目的是什么?我应该什么时候使用它?

现在我正在使用它像 hm-this-bug-is-kinda-strange-maybe-async-will-fix-it-yep-id-did-yey 。它并没有让我对我的代码有任何信心,因为当我出现一些时间错误时,我正在点async

1 个答案:

答案 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与Jav​​aScript不同,但这篇关于事件循环的Dart文章是我发现的描述事件循环和微任务队列的最佳文章:https://www.dartlang.org/articles/event-loop/