这种情况
假设有一个文本区域的评论和一个按钮,进入不同的页面查看你所有的评论。
评论时得到更新文本区域
触发一个模糊
事件。这意味着当用户集中在另一个元素时,我们将保存当前文本区域
价值。
这是一种幼稚的方法自动保存功能。
如果你意识到在这个阶段,会发生什么荣誉!
如果不是,继续阅读。
开发人员通常认为客户会经历相同的速度和响应时间,因为他们在他们的开发环境。
这个问题
为什么这是一个竞争条件或有什么问题吗?
我们假设:
- 需要1到3秒拯救你的评论到数据库。
- 需要一半一秒从数据库中检索所有的评论。
- 需要一个微不足道的两页之间移动的时间。
现在,如果一个用户类型的评论,点击进入下一个页面没有故意点击其他地方以确保评论保存,通常情况下,用户将体验比赛条件下,特别是在蜂窝网络。
当竞态条件帖子
调用保存新创建的评论仍在空中,在用户在查看第二页的评论。
在一个正常的开发环境,这一点可能像预期的那样工作。此外,这通常是发现在开发周期的后期和复杂的业务逻辑,等等。
运营商的解释
我们使用FromEvent
运营商对我们处理文本区域
的模糊
这样我们可以叫我们的事件saveComment
函数在组件内部文件。
我们也使用FromEvent
操作符来处理点击
从我们的按钮事件。
我们使用推迟
因为fromEvent
运营商希望,使可见热。我们这样做,当组件加载,模板参考尚未初始化。将会有一个错误,因为这将是未定义的。
当我们在订阅ngAfterViewInit
,我们可以和参考推迟
允许我们这样做。
所以,简而言之,推迟
热的冷。
我们使用延迟
因为我们要确保我们的指定事件运行第一如果他们都解雇了。当你看到实现这将变得更清楚。
我们使用mapTo
我们知道如何区分事件处理它们进一步连锁运营商。
现在,concatMap
运营商基本上可以暂停所有传入的请求而前一个请求仍然活跃。
更新
我们已经做了一些修改模板。正如我前面说的,现在我们将处理事件在我们的组件,而不是把他们的模板。
然后,我们将可见。
详细报道的
从我们有一些变化。事实上,现在我们的模板看起来更干净。
那么,到底发生了什么?
当我们的文本区域
已经发射了模糊
事件,它应该表现得像以前一样。
它将:
- 现在被称为从可观察到的。
- 的
mapTo
将会改变它一个
这样concatMap
运营商知道如何处理它;这就像一个标识符。
另外…
如果模糊
事件触发单击事件触发,比如当用户键入文本区域,并立即单击按钮时,它将导致这一场景。
而不是希望模糊
事件序列完成时间,这样,当用户导航时,他们看到更新后的列表,我们现在:
- 确保,如果他们都叫,单击调用将等待
50
在继续之前。 - 而点击呼叫等待
模糊
,调用将会到concatMap
。 - 当单击调用完成等待和希望进入
concatMap
而模糊
事件仍在飞行中,它会等待,直到它完成才可以导航,的本质concatMap
。