谈一谈JS消息机制和事件机制的理解javascript技巧

消息/事件机制是几乎所有开发语言都有的机制,并不是deviceone的独创,在某些语言称之为消息(Event),有些地方称之为(Message).其实原理是类似的,只不过有些实现的方式要复杂一点。我们deviceone统一就叫消息.

消息基础概念

还有一些初学者不太熟悉这个机制,我们先简单介绍一些基础概念,如果熟悉的人可以跳过这个部分。一个/条消息可以理解为是一个数据结构,包含以下几个基本部分:

2.消息名:就是消息的唯一标示

3.消息数据:消息发出后附带的数据,有可能数据是空

消息从种类上又可以分为2种:

1.系统消息:由操作系统或deviceone系统发送出来的消息,消息的名称是固定的。

2.自定义消息:由开发者自己定义,自己发送出来的消息,消息的名字是随意的,可以任意定义。

举例说明:

比如用户点击一个do_Button按钮,就会触发一个系统消息,包含3个部分:

1.消息源:用户点中的button对象

2.消息名:touch

3.消息数据:这个消息没有附带数据

比如用户通过do_Button按钮触发一个自定义事件,包含3个部分:

1.消息源:button对象

2.消息名:用户随便定义,叫aaa,bbb,ccc都可以

3.消息数据:附带的数据由触发消息的时候设定

发布/订阅模式

发布/订阅模式是最常用的设计模式之一,是消息机制的核心,其特点就是降低耦合度,让二个独立的对象不互相依赖。简单介绍一下,熟悉的同学可以跳过。

我们先从现实的一个简单例子来说明这个问题,参考下图:

从这个图我们可以看出

1.消费者和出版社互相不认识,消费者不需要了解他想要的杂志是具体哪家出版社出的;出版社也不需要了解具体是哪个人定了他们出版社发行的书。

2.消费者和出版社必须都认识邮局。

3.消费者需要告诉邮局消费者的名字地址以及想要订阅的杂志名字

4.可以多个消费者订阅同一本杂志

5.邮局拿到杂志后,会一一通知消费者,通知的时候同时把杂志送到消费者手里。

看完上面现实例子,我们再来看抽象的描述会更清晰一点,看下图:

和上面的实际例子描述一一对应:

1.系统/开发者和函数对象互相不依赖,系统/开发者只管触发一个消息,并不关心谁去接受

2.系统/开发者和函数对象必须能获取到消息源对象

3.函数对象订阅消息的时候需要标示消息的名称和函数对象的引用

4.可以多个函数对象订阅同一个消息源同一名字的消息

5.消息源触发消息会一一通知所有订阅者,并把data数据传递到回调函数对象

看完抽象的描述,我们最后来看实际的deviceone开发的例子,还是以do_Button为例子。

1.当用户点击一个button,触摸到的时候,系统会获取到button这个对象作为消息源,fire一个”touch”消息,任何订阅了”touch”消息的函数对象都会接收到这个消息并引起函数的执行。

//获取button对象varbtn_hello=ui("btn_hello");//定义函数对象functionf(){//当btn_hello这个按钮接收到手指点击就会执行下面的代码deviceone.print("f函数接收到点击触发消息")}functionf(){//当btn_hello这个按钮接收到手指点击就会执行下面的代码deviceone.print("f函数接收到点击触发消息")}//f,f订阅button的touch消息btn_hello.on("touch",f);btn_hello.on("touch",f);2.我们可以为button对象定义2个自定义的消息”message1”和”message2”,分别有2个函数对象订阅这2个消息。但是最后要触发这个消息必须是开发者通过调用fire函数才能触发,这就是和系统消息的区别。

//获取button对象varbtn_hello=ui("btn_hello");//定义函数对象functionf(d){//当btn_hello这个按钮接收到开发者触发的消息message就会执行下面的代码deviceone.print("f函数接收到message消息,消息的数据是:"+d)}functionf(d){//当btn_hello这个按钮接收到开发者触发的消息message就会执行下面的代码deviceone.print("f函数接收到message消息,消息的数据是:"+d)}//f,f订阅button的touch消息btn_hello.on("message",f);btn_hello.on("message",f);//触发消息btn_hello.fire("message","data");btn_hello.fire("message","data");看到这里,你肯定会奇怪,为什么我们要在button上自定义对象?这有神马意义?其实确实没有意义也没有必要,这里只是拿button举例子,在常规的开发中,基本不会这么用。

消息的使用

前面讲了这么多,现在才是deviceone消息的使用。使用其实很简单,上面的例子基本说明的了系统事件和自定义事件的使用方法。

有几个概念再说明一下

1.deviceone的所有对象,包括UI,MM,SM对象都可以是消息源

看以下的例子,test1.ui和test2.ui有可能在一个page作用域,也有可能不在一个作业域,只有在一个作用域fire的消息才能正确送达回调函数。

判断是否一样,可以通过打印page的地址page.getAddress().

//在test.ui.js里订阅消息varpage=sm("do_Page");deviceone.print(page.getAddress());page.on("message",function(d)){deviceone.print(d);}//在test.ui.js触发消息varpage=sm("do_Page");deviceone.print(page.getAddress());page.fire("message","data");如果不在同一page作用域,则可以把消息订阅在2个page都能共享到的app作用域上面的代码改成:

//在test.ui.js里订阅消息varapp=sm("do_App");app.on("message",function(d)){deviceone.print(d);}//在test.ui.js触发消息varapp=sm("do_App");app.fire("message","data");3.同样的函数对象可以重复订阅一个对象源的消息,触发消息的时候会使函数执行多次,这是初学者经常犯的错误。

varpage=sm("do_Page");varcount=;functionf(){deviceone.print("执行次数"+(count++));}page.on("message",f);page.on("message",f);page.fire("message");看上面的例子,如果执行的话,会打印2此,因为订阅了2次,或许你会说谁会写这样的代码?实际情况肯定没有这么容易看出来执行了重复的on函数,实际情况经常是比如在点击事件里执行on函数,每点击一下按钮,就重复订阅一次。

4.消息的订阅一定要在消息的触发之前,这是初学者经常犯的错误。

varpage=sm("do_Page");varcount=;functionf(){deviceone.print("执行次数"+(count++));}page.fire("message");page.on("message",f);看上面的例子,如果执行的话,会没有效果,或许你会说谁会写这样的代码?实际情况肯定没有这么容易看出来顺序反了,实际情况经常是比如on函数执行在某一个函数的回调函数里,你无法确定回调函数啥时候执行,是否是在fire之前执行。一般碰到这种情况可以加几个deviceone.print打印一下看看是on先执行还是fire先执行。

5.有订阅就有取消订阅,取消订阅是off函数,之所以很少用,是因为closePage的时候会自动把当前page作用域订阅的消息全部释放。

但是如果消息订阅在app作用域,就要注意,可能需要手动去取消订阅。否则就会出现触发消息的时候会使函数执行多次的问题。

varpage=sm("do_Page");varcount=;functionf(){deviceone.print("执行次数"+(count++));}page.on("message",f);page.fire("message");.page.off("message");page.fire("message");看上面的例子,打印只会执行一次,因为fire一次后就取消订阅了。

THE END
1.消息机制第一阶段: 消息发送 第二阶段: 动态方法解析 第三阶段: 消息转发 将消息转发给别人去实现; 如果经历过以上3个阶段objc_msgSend 找不到合适的方法进行调用,会报错unrecognized selector sent to instance; 注:元类对象是一种特殊的类对象; 二、objc_msgSend底层实现: https://www.jianshu.com/p/099ce2e51305
2.面向对象的基本概念面向对象的基本概念有对象、类、抽象、封装、继承、多态、接口、消息、组件、模式和复用等。 1.对象 对象是由数据及其操作所构成的封装体,是系统中用来描述客观事物的一个封装,是构成系统的基本单位,采用计算机语言描述,对象是由一组属性和对这组属性进行操作的一组服务构成。 https://blog.csdn.net/faihung/article/details/76599778
3.java中kafka发消息返回结果kafka发消息写法一:发送的消息对象是字符串 1 创建项目 2 项目结构 3 application.yml 配置文件 4 生产者 KafkaProducerComponent 5 消费者 KafkaConsumerComponent 6 控制器(GET请求发送消息) 7 启动类 8 测试效果 写法二:发送复杂消息对象 1 创建项目 2 项目结构 https://blog.51cto.com/u_16213626/9284004
4.对象存储POST上传对象存储API文档用户除了可以用PUT直接上传对象外,还可以使用POST上传对象。 单次上传对象大小范围是[0, 5GB],如果需要上传超过5GB的大文件,需要通过多段操作来分段上传。 与PUT上传的区别 PUT上传中参数通过请求头域传递;POST上传则作为消息体中的表单域传递。 PUT上传需在URL中指定对象名;POST上传提交的URL为桶域名,无需指定对象https://ecloud.10086.cn/op-help-center/doc/article/64198
5.Java语言程序设计试卷6套A、可提供多种实现方法 B、清楚边界隐藏内部细节 C、分布性 D、有利于复杂对象管理 E、安全和可移植 F、消息驱动 3、Java语言的多态性可以体现在?(正确答案:ABCDF) A、函数的重载 B、不同数据类型之间的合理转换 C、抽象函数和抽象类 D、多个构造函数 E、多个父类 F、派生出不同子类 https://developer.aliyun.com/article/1431557
6.教你3步画好时序图,轻松掌握产品经理都在学的流程分析利器首先,选定要展开分析的用例或目标;接着,分析都有哪些对象、角色参与了实现过程;然后,将它们在实现目标过程中,彼此之间的交互动作,按照时间轴的顺序列出来。 再简单点,就是定目标、找对象、列消息三步走。 1、定目标 画时序图,与活动图一样,要指定某个用例,或目标展开。这些动态视图,是用来描述在静态视图(如用https://www.niaogebiji.com/article-78077-1.html
7.消息分类标准通知消息管理规则推送服务旅游出行类App 便捷生活类App 运动健康类App 音乐类App 游戏类App 摄影类App 版本更新说明 使用入门 开发准备 配置AppGallery Connect 集成HMS实时运动Bundle对象键值 基础能力支持的国家/地区 扩展能力支持的国家/地区 设备接入 说明 运动设备接入开发指南 运动设备接入 有氧健身器材接入 https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/message-classification-0000001149358835
8.面向对象数据模型中的基本概念,如对象消息类继承重载多态消息是对象之间相互请求或相互协作的唯一途径,一个对象必须通过向其他对象发送消息的形式使得其他对象提供各自所能实现的功能。在面向对象的数据模型中,消是对象之间唯一的通信形式,也就是外界能够引用对象操作及获取对象状态的唯一方式,消息分为公有和私有两类,属于同一个对象的消息,其中有些是可由其他对象https://zhidao.baidu.com/question/402910824616679605.html