问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁会使用AMP教我!!!

发布网友 发布时间:2022-05-18 07:51

我来回答

3个回答

懂视网 时间:2022-05-18 12:12

事件分发的作用

在为页面添加各类交互功能时,我们熟知的最简单的做法就是为页面元素绑定事件,然后在事件处理函数中,做我们想要做的动作。就像这样的代码:



如果我们要做的动作不复杂,那么实际逻辑功能的代码,放在这里是可以的。如果今后需要修改,再到这段事件处理函数的位置来修改。

再进一步,为了做适当的代码复用,我们可能会把逻辑功能中的一部分分拆到一个函数内:



这里的函数doSomethingElse对应的功能可能会在其他地方用到,所以会这样做分拆。此外,可能会有设定坐标这样的功能(假定函数名为setPosition),则还需要用到浏览器事件对象event提供的诸如指针位置一类的信息:



此处有一个不推荐的做法是直接把event对象传递给setPosition。这是因为,分清逻辑功能和事件侦听两种职责,是一种良好的实践。只让事件处理函数本身接触到浏览器事件对象event,有利于降低代码耦合,方便独立测试及维护。

那么,功能越来越多,越来越复杂了会怎么样呢?如果沿用之前的做法,可能是这个样子:



虽然这样用也没问题,但这种时候其实就可以考虑更优雅的写法:



这种形式就是事件分发,请注意,这里的事件并不是指浏览器原生的事件(event对象),而是逻辑层面的自定义事件。上面的aya:clicked就是一个随便写(really?)的自定义事件名称。

显然到这还没结束,为了完成之前的复杂的功能,我们还需要将自定义事件和要做的事关联在一起:



看起来又绕了回来?没错,但这是有用的。一方面,浏览器原生事件的侦听被分离并固化了下来,以后如果逻辑功能有变化,例如减少几个功能,则只需要到自定义事件的关联代码部分做删减,而不需要再关心原生事件。另一方面,逻辑功能的调整变得更为灵活,可以在任意的代码位置通过subscribe添加功能,而且可以自行做分类管理(自定义的事件名)。

简单来说,事件分发通过增加一层自定义事件的冗余(在只有简单的逻辑功能时,你就会觉得它是冗余),降低了代码模块之间的耦合度,使得逻辑功能更为清晰有条理,便于后续维护。

等下,前面那个出境了好几次的很有存在感的amplify是干什么的?

Nice,终于是时候介绍这个了。
AmplifyJS

事件分发是需要一定的方法来实现的。实现事件分发的设计模式之一,就是发布/订阅(Publish/Subscribe)。

AmplifyJS是一个简单的JavaScript库,主要提供了Ajax请求、数据存储、发布/订阅三项功能(每一项都可独立使用)。其中,发布/订阅是核心功能,对应命名是amplify.core。

2015728151503102.jpg (342×85)

amplify.core是发布/订阅设计模式的一个简洁的、清晰的实现,加上注释一共100多行。读完amplify的源码,就可以比较好地理解如何去实现一个发布/订阅的设计模式。
代码全貌

amplify.core的源码整体结构如下:



可以看到,amplify定义了一个名为amplify的全局变量(作为global的属性),它有3个方法publish、subscribe、unsubscribe。此外,subscriptions作为一个局部变量,它将保存发布/订阅模式涉及的所有自定义事件名及其关联函数。
publish

publish即发布,它要求指定一个topic,也就是自定义事件名(或者就叫做话题),调用后,所有关联到某个topic的函数,都将被依次调用:



[1],参数topic必须要求是字符串,否则抛出一个错误。

[2],args将取得除topic之外的其他所有传递给publish函数的参数,并以数组形式保存。如果对应topic在subscriptions中没有找到,则直接返回。

[3],topicSubscriptions作为一个数组,取得某一个topic下的所有关联元素,其中每一个元素都包括callback及context两部分。然后,遍历元素,调用每一个关联元素的callback,同时带入元素的context和前面的额外参数args。如果任意一个关联元素的回调函数返回false,则停止运行其他的并返回false。
subscribe

订阅,如这个词自己的含义那样(就像订本杂志什么的),是建立topic和callback的关联的步骤。比较特别的是,amplify在这里还加入了priority(优先级)的概念,优先级的值越小,优先级越高,默认是10。优先级高的callback,将会在publish的时候,被先调用。这个顺序的原理可以从前面的publish的源码中看到,其实就是预先按照优先级从高到低依次排列好了某一topic的所有关联元素。



[1],要理解这一部分,请看amplify提供的API示意:



可以看到,amplify允许多种参数形式,而当参数数目和类型不同的时候,位于特定位置的参数可能会被当做不同的内容。这也在其他很多JavaScript库中可以见到。像这样,通过参数数目和类型的判断,就可以做到这种多参数形式的设计。

[2],订阅的时候,topic是允许空格的,空白符将被当做分隔符,认为是将一个callback关联到多个topic上,所以会使用一个循环。added用作标识符,表明新加入的这个元素是否已经添加到数组内,初始为false。

[3],每一个callback的保存,实际是一个对象,除callback外还带上了context(默认为null)和priority。

[4],这个循环是在根据priority的值,找到关联元素应处的位置。任何topic的关联元素都是从无到有,且依照priority数值从小到大排列(已排序的)。因此,在比较的时候,是先假设新加入的元素的priority数值较大(优先级低),从数组尾端向前比较,只要原数组中有关联元素的priority数值比新加入元素的小,循环就可以中断,且可以确定地用数组的splice方法将新加入的元素添加在此。如果循环一直运行到完毕,则可以确定新加入的元素的priority数值是最小的,此时added将保持为初始值false。

[5],如果到这个位置,元素还没有被添加,那么执行添加,切可以确定元素应该位于数组的最前面(或者是第一个元素)。
unsubscribe

虽然发布和订阅是最主要的,但也会有需要退订的时候(杂志不想看了果断退!)。所以,还会需要一个unsubscribe。



读过前面的源码后,这部分看起来就很容易理解了。根据指定的topic遍历关联元素,找到callback一致的,然后删除它。由于使用的是splice方法,会直接修改原始数组,因此需要手工对i和length再做一次调整。
Amplify使用示例

官方提供的其中一个使用示例是:



结合前面的源码部分,是否对发布/订阅这一设计模式有了更明确的体会呢?
补充说明

你可能也注意到了,AmplifyJS所实现的典型的发布/订阅是同步的(synchronous)。也就是说,在运行amplify.publish(topic)的时候,是会没有任何延迟地把某一个topic附带的所有回调,全部都运行一遍。
结语

Pub/Sub是一个比较容易理解的设计模式,但非常有用,可以应对大型应用的复杂逻辑。本文简析的AmplifyJS是我觉得写得比较有章法而且简明切题(针对单一功能)的JavaScript库,所以在此分享给大家。

热心网友 时间:2022-05-18 09:20

APM高低之谈,其实已是“老生长谈”了,很多HUMer一直追求高APM,说什么“高APM是体面”之类的话。本人打魔兽3已经近2年,从ROC1.00开始,那个时候还没有什么软件看APM,所以对这方面一穷二白!后来有了录像分析软件,知道什么是APM,知道韩国“实力派”普遍APM>200,自己就刻意追求更“高”的境界,APM从平均70多,直升至当时的平均180,而实力的确也得到很大提高。但是其后到了瓶颈,APM升不上去,BN等级也停滞不前。 结果仔细分析自己以前的replay,发现APM提过的基本都是“选择编队”,其他的基本保持一个数值,而且还发现有些细节上出现倒退,例如MF漏宝、农民空闲等等,后来每次对战都留意屏幕的一切细节,尽量做到高效操作,APM也降到现在的130~150左右,反而觉得对战中的操作细节比以前把握得更好了,所以APM不是越高越好,够用就OK,最重要的是效率,留更多的时间去思考!另外我觉得APM曲线不用一直保持最高水平,最重要的是战斗时可以做到一刹那的APM提高,附件图的就是我自己的APM曲线,平时生产、MF时候在120左右,当战斗时候可以迅速飚升至250+!

热心网友 时间:2022-05-18 10:38

APM是 actions per minute 的意思,也就是每分钟的按键率。 在下个人纠正楼上一个严重的错误 当2位高手对战时 通常双方的AMP都很高 但是他们不是盲目的乱点 如果楼主您看过高手的VOD的话 您会发现 高手一般点一个地方会点2次以上 看似乱点 其实不然 高手在比赛过程中通常处于很紧张 很兴奋的状态 他们需要保持很高的点击率 来防止突然交战时候的高效率操作 如果高手开始AMP很低 当2军突然交战 很难适应突然的高效率操作 高手的高AMP是为了保持状态
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脚崴了挂什么科、急急急 linux 解压缩工具--tar命令 生日祝福语闺蜜 简短独特暖心 QQ有哪些隐藏的图标??他们分别是什么??怎么样点亮?? QQ业务的各种图标怎么点亮? qq怎么点亮图标和名字 诗中书万象=求下联 大爱如山藏万象下联 中国电子展:电位器和可调电阻的区别是什么?这四点很明显 电位器的接线方法是什么 电位器的工作原理如何 哪里有免费的ftp上传工具,最好是破解的,邮箱caichench@126.com 跪求cuteftp for mac破解版 福建省石化加油卡下载什么软件? 苹果手机下载加油中石化后打不开里面的页面 高效脱模剂和模具清洗剂是一种产品吗 模具清洗剂喷在有机玻璃上怎么处理? 什么是模拟试id卡啊 小米手机如何模拟id卡 白芷最适合播种在什么地方?为什么? 白芷属于属于喜阴之物,还是喜阳之物? 表格第一行列标签单元格中不显示公式? 白芷价值特别高需求量也很大,种植的时候应注意什么? 白芷两年收割一次可不可以白芷两年收割一次可不可以?? 白芷的成长受哪些因素影响,你都有哪些了解呢? 90年代广州人的衣食住行?? 土豆皮敷在痛风发炎的地方有用吗? 广东90年代喝什么酒 广东肇庆90年代村居厂爆改湖景民宿,值得打卡吗? 为什么我的电脑上的办公软件突然都不能用了?还显示说无法访问你试图使用的功能所在的网络位置?该怎么解决 快手实名认证人去世怎么更换? 淘宝动态显示收到了宝贝什么意思 在网上预约的纪念币可以比限定额少吗 莫雄的社会评价 长孙无忌的长是念掌还是常? 百家姓里双姓的有哪些? 列举10位中国古代画家 “长孙”这个姓来自于那里? 唯一一个黄河穿过的省会城市,你知道是哪吗 中国唯一一个黄河穿城而过的省会城市是哪个# 黄河唯一穿过的省会城市是哪个? 黄河唯一穿过的省会城市是哪个 兰州哪个省 黄河穿过的省会城市 黄河唯一经过的省会城市是那座城市? 兰州的介绍 加了AMP的培养基能高压后再加AMP使用吗? 杭州社保是当月交当月的吗 自己不小心把自己的删除了,怎么样找回来? 次中音是什么乐器 次中音是什么?