Polymer:什么时候使用异步?
Polymer: when to use async?
聚合物中 async
方法的目的是什么?我应该什么时候使用它?
现在我正在使用它 hm-this-bug-is-kinda-weird-maybe-async-will-fix-it-yep-id-did-yey.它不会让我对我的代码有任何信心,因为我正在洒 async
就在出现一些计时错误时。
这里的答案会略有不同,具体取决于您使用的是 Polymer 0.5 还是 1.0。在 1.0 中,更多操作是同步的,因此您可能看不到对异步的那么多需求(还有 async method works slightly differently in 1.0)。
让我们从 0.5 开始。大多数情况都与更改属性的影响有关。观察数据绑定或观察者中使用的属性是否发生变化。当你改变其中之一
属性,该更改的任何副作用都会发生异步,并带有微任务计时。这意味着工作发生在当前事件处理程序 returns 之后,但 在 处理下一个事件之前。
换句话说,如果我有这样的数据绑定:
<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/)
聚合物中 async
方法的目的是什么?我应该什么时候使用它?
现在我正在使用它 hm-this-bug-is-kinda-weird-maybe-async-will-fix-it-yep-id-did-yey.它不会让我对我的代码有任何信心,因为我正在洒 async
就在出现一些计时错误时。
这里的答案会略有不同,具体取决于您使用的是 Polymer 0.5 还是 1.0。在 1.0 中,更多操作是同步的,因此您可能看不到对异步的那么多需求(还有 async method works slightly differently in 1.0)。
让我们从 0.5 开始。大多数情况都与更改属性的影响有关。观察数据绑定或观察者中使用的属性是否发生变化。当你改变其中之一 属性,该更改的任何副作用都会发生异步,并带有微任务计时。这意味着工作发生在当前事件处理程序 returns 之后,但 在 处理下一个事件之前。
换句话说,如果我有这样的数据绑定:
<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/)