精华内容
下载资源
问答
  • once和on
    2021-01-05 19:04:36

    观察者模式是一种软件设计模式,观察者定义了一种一对多的关系,观察者监听被观察者,等待通知,一旦被观察者发出通知,所有观察者均会接收到通知,并做出一些具体业务。

    实现on、emit、off、once。

     

    class EventEmitter {
        constructor() {
            this._events = {}
        }
        on(event, cb) {
            if (!this._events[event]) {
                this._events[event] = [];
            }
            this._events[event].push(cb);
            return this;
        }
        emit(event, ...args) {
            let arr = this._events[event];
            for (let cb of arr) {
                cb(...args);
            }
            return this;
        }
        off(event, cb) {
            if (!cb) {
                return;
            }
            if (this._events[event]) {
                this._events[event] = this._events[event].filter((cbitem) => {
                    return cb !== cbitem;
                })
            }
            return this;
    
        }
        once(event, cb) {
            let fn = function(...args) {
                cb.apply(this,...args);
                this.off(event,fn);
            }
            fn = fn.bind(this)
            this.on(event,fn);
            return this;
        }
    }

     

    更多相关内容
  • nodejs里socket.on和socket.once的单步调试

    千次阅读 2019-04-12 10:52:18
    一个网友的求助: ...其他朋友建议他用socket.once, 而非socket.on socket对象本身并没有on的方法: 原型链上才有: 执行on(“createKOIID”, fn)之前的监听事件函数池: ...

    一个网友的求助:
    https://stackoverflow.com/questions/49788422/socket-on-event-gets-triggered-multiple-times
    其他朋友建议他用socket.once, 而非socket.on

    clipboard1

    socket对象本身并没有on的方法:

    clipboard2

    原型链上才有:

    clipboard3

    执行on(“createKOIID”, fn)之前的监听事件函数池:

    clipboard4

    使用on注册之后:

    clipboard5

    clipboard6

    clipboard7

    clipboard8

    clipboard9

    clipboard10

    clipboard11

    再看once的实现:
    on是一个函数,once传入的监听函数作为一个属性赋值到on上:

    clipboard12

    然后照常用on注册事件:

    clipboard13

    注册完毕。
    事件触发时,首先执行on:

    clipboard14

    在on里面会先解除掉对event的注册:

    clipboard15

    第1600行会把事件处理函数从handler repository里移除掉。

    最后执行对应的事件处理函数。

    clipboard16

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

    展开全文
  • 1.$refs的使用场景 父组件调用子组件的方法,可以传递数据。 父组件: <child ref=child></child> <button @click=getMyEvent>点击父组件</button> [removed] import ChildA from './child.vue... }
  • socket.emit() 作用: 服务器端客户端之间可以使用socket端口对象的emit方法,互相发送事件。 socket.emit(event,data,[callback]) ...一方使用emit发送事件后,另一方可以使用on,或者once方法,

    socket.emit()

    作用: 服务器端和客户端之间可以使用socket端口对象的emit方法,互相发送事件。

    socket.emit(event,data,[callback])
    

    event: 参数值为一个用于指定事件名的字符串,如"connect"
    data: 代表该事件中携带的数据。这个数据就是要发送给对方的数据。数据可以是字符串,也可以是对象。
    callback: 值为一个参数,用于指定一个当对方确定接收到数据时调用的回调函数

    一方使用emit发送事件后,另一方可以使用on,或者once方法,对该事件进行监听。once和on不同的地方就是,once只监听一次,会在回调函数执行完毕后,取消监听。

    socket.on() || socket.once()

    作用: 监听客户端或者服务端socket端口对象发送的socket请求

    socket.on(event,function(data,fn){})
    socket.once(event,function(data,fn){})
    

    event: 参数值为一个用于指定事件名的字符串,如"connect"
    function: 当监听到该事件的时候执行的方法
    data: 该事件传过来的data参数,可以是字符串,也可以是对象

    两个方法对比

    socket.on():可以一直监听
    socket.once():只监听一次,监听完成后,就会取消监听

    socket.in()

    **作用:**给指定房间的所有socket发送消息

    socket.in("this room").emit("event",{'data':'test'})
    
    展开全文
  • 语言:español (Latinoamérica) Chrome上的TDI ClickOnce支持
  • 关于使用include还是include_once(以下,都包含require_once), 这个讨论很长了, 结论也一直有, 就是尽量使用include, 而不是include_once, 以前最多的理由的是, include_once需要查询一遍已加载的文件列表, 确认是否...
  • 基于以上的分析觉得如果单独去处理on和once确实达不到预期的结果,总结一下就是: 在APP中,渲染进程使用once监听,则注销登陆时会导致,监听过一次就会销毁监听事件,但是APP应用并没有退出,没办法重新加载APP...

    最近在搞Electron-vue的项目,由于之前没做过这种客户端的开发,所以在开发的过程中一直磕磕绊绊,碰到各种异常的情况,而且网上的资料很少,很多问题都找不到解决办法,而且很多博客都是重复的。一篇博客被很多人转载,而且有的博主会把自己的一片文章发布到不同的平台上,这就导致在搜索的时候,看到很多篇一样的文章,而且都是不能解决问题的,就很烦。

    好了闲话少说,这里只是吐槽一下网上千篇一律的博客。我所碰到的问题是这样的。

    我做的客户端挺简单的,只有登录页,主页面以及修改密码页,所以页面要展示的东西不是很多,由于主页面没有什么可以展示的,所以几乎所有的操作都会放到托盘中处理,这样可以减少页面由于没有内容而导致的空白太多。就像下面这样简单地浮条,类似于搜狗输入法似的。而且登录后默认会隐藏到托盘中,用户点击托盘图标才会展示。
    在这里插入图片描述
    基于上面的描述,我会把主页面的功能都集中在托盘中,如下。
    在这里插入图片描述

    修改密码会从主页面切换到修改页面,
    注销功能会从主页面切换到登录页面,
    退出功能是直接退出销毁窗口。

    其中的修改密码和注销功能,都是从主进程渲染进程中发送请求,渲染进程收到请求进行页面跳转。

    如果是主进程主动发起事件,那就必须使用窗口发送事件请求mainWindow.webContents.send,然后在渲染进程中监听事件,做一些逻辑处理。无论是主进程主动发送事件还是渲染进程主动发送,然后主进程监听到再次发送事件。渲染进程都需要使用on或者once去做监听。

    once: 建立一次性的监听,当监听事件触发执行后,便会销毁该事件监听。
    on: 建立永久性监听,即会持续监听该事件的触发,这样可以在程序的生命周期中不断地监听事件触发。

    好了,知道上面的两种监听方式的区别,我们来看看实际操作会碰到什么问题。

    我是在App.vue中用once去监听注销事件,当注销成功后,返回登录页,然后注销事件监听就会被销毁。我们虽然返回到登录页,但是整个APP的生命周期还是在的,并没有重新加载整个APP,当然我们也不会让他去重新加载整个应用。

    那么就会出现一个问题,我在第一次注销时,是能够注销成功的,注销成功会销毁注销的监听事件,但是等你重新登录后,APP不会重新加载,导致你的注销事件的监听并没有重新建立,那么当你再次点击注销功能时,发现主进程发送的注销事件,在渲染进程中没法监听了。因为你上次上次注销已经销毁了。

    猜想,既然使用once只是一次性的,在使用完就会被销毁,那么我使用on是不是就可以建立一直监听了,那么在多次重复登录注销,都不会错误了?

    对,你想的不错,确实是这样,它会一直处于监听状态,而不会因为销毁而导致无法再次注销。

    我们来看一下官方给出的on的解释:
    在这里插入图片描述
    为什么要强调这一点呢?
    监听channel,当有新消息到达时,使用listener调用listener,注意这个新消息,这个消息指的是什么呢?

    有的可能会认为那肯定是ipcRenderer.on的那个事件的新消息了?如果你是用的是我这种通过child_processspawn/exec去跟子进程通信,那么你所有的写操作的结果都会更新到stdin中,这就导致如果你使用on建立长监听,有信息更新就会去调用他的callback函数。

    可能有人没理解什么意思。比如我现在有两个操作,一个修改操作,一个注销操作,两个操作都是会通过stdin进行写操作,那么如果我给注销功能加了个长监听,那么在我在修改密码的时候进行的写操作会更新到stdin中,导致信息更新,那么也就会被注销的监听事件给监听到,致在修改密码之后就会在调用修改密码的callback函数之后再调用注销的callback函数,从而导致逻辑错误。

    所以综上所述无论你使用on或者onceApp.vue中做监听事件都行不通。

    于是我就尝试着在其他模块去执行once,既然App.vue始终只是被加载一次,那我就在其他模块,比如主页面去做这个操作行不行呢?因为无论是登录后还是修改密码后,都会返回到主页面,那么在注销之后,注销事件被销毁了,登陆之后又重新添加一个注销事件,然后再注销就不会找不到监听事件了?

    但事实并非如此,我们知道如果在主页面去添加监听事件,那么我们只能在生命周期函数中去添加,那么在加载这个模块的时候就会去添加监听事件,我是放到vuecreated方法中的。你可想而知,当你反复的从修改页面调到主页面的时候,主页面的created总会被执行,那么就导致会反复创建注销的监听函数。那么你在做修改操作的时候,还是会去触发监听事件,多个once其实就相当于on了。
    在这里插入图片描述
    我也曾尝试着在App.vue中使用once去做监听,然后注销的时候去重新加载渲染整个APP,就是使用nextTick的方式,然后给router-view添加v-if去控制显示隐藏,然后通过事件触发比如登陆时间去重新reload,发现输出打印,并没有重新执行created生命周期函数,导致无法从新创建一个新的注销监听事件

    基于以上的分析觉得如果单独去处理ononce确实达不到预期的结果,总结一下就是:

    1. APP中,渲染进程使用once监听,则注销登陆时会导致,监听过一次就会销毁监听事件,但是APP应用并没有退出,没办法重新加载APP导致没有建立新的监听事件,所以无法触发第二次注销事件的监听,无法注销。
    2. 如果在APP中使用对渲染进程使用on监听,就会开启持续监听状态,该监听会导致其他操作在执行stdin.write时,仍旧会触发登出事件,就会导致修改密码之后触发登出事件,然后程序出现异常。
    3. 如果不在APP中对渲染进程监听,即在其他功能模块使用once监听,则进行其他操作时,返回该应用时,就会再次注册该退出事件,导致其他操作时仍会监听到write操作,导致注销仍会触发执行,导致程序异常。

    思考了一下,还是要回到怎样才能避免在执行其他操作的时候不会触发注销的callback函数,或者说是即便触发了,我们也可以使用一些小技巧组织send的发送,这样在渲染进程中就无法监听到主进程的事件,也就不会走我们的注销逻辑,这样就可以了。

    按照这种思考方法我们就得出这样的结论:在主进程中定义标志位默认为true,此时可以执行注销操作。然后其他的操作执行write的时候,将该标志位置为false。当结果执行完后,将该标志位回档即置为true,那么再做完其他操作时返回到主页面的时候,不会影响正常的注销操作

    当我们使用一种新的技术做开发的时候,文档资料远远不能满足我们的开发,因为我们的业务可能千变万化,涉及的复杂度也不会是官方提供的那么操作。需要我们在看懂API的同时,有自己的结局问题的办法思路,去在日常开发时,利用一些小技巧去实现我们的功能。

    // 登出
    function logout() {
      child.stdin.write('{"type":"logout"}\n')
      child.stdout.on('data', (data) => {
        if(isNotPassword){
          mainWindow.webContents.send('logout', returnString(data))
          isNotPassword = true
        }
      })
    }
    

    该篇文章文字较多,贴图代码较少,因为是在解决问题之后写的博客,之前错误代码就没有恢复,所以就没有粘贴出来。如果有疑问欢迎留言。

    展开全文
  • 简单模拟发布订阅模式之ononce、off、emit、clear
  • Flink 的 Exactly Once At Least Once

    千次阅读 2022-03-28 18:49:41
    exactly-once:即使producer重试发送消息,消息也会保证最多一次地...这表明消息传递系统客户端应用程序必须配合调整才能实现excactly-once at-least-once:如果producer收到来自Kafka broker的确认(ack)或者ack
  • Vue实例事件总结($on,$once,$off,$emit)

    万次阅读 2019-03-27 11:30:31
    1.什么是实例事件? 实例事件就是在构造器外部调用构造器内部的数据。 2.使用场景:比如构造器已经...3.与$on对应的还有一个$once 上述代码只改一个单词$once app.$once('reduce',function(){ console.log("减的方...
  • 查看Vue3Api文档后发现该实例方法已被移除,特此记录。详情请点击链接查阅。
  • Android代码-Once

    2019-08-05 18:48:23
    Once A small Android library to manage one-off operations for API 9 and higher. Some things should happen...First things first, you'll need to initialise Once on start up. In your Application class's
  • 请实现一个Event类,继承自此类的对象都会拥有四个方法on,off,once和trigger -ES6创建类 -自定义事件机制 -on添加事件监听 -off取消事件监听 -once事件只执行一次 -trigger执行事件 Event类的实现: ...
  • 与$on对应的还有一个$once,上述代码只改一个单词$once app.$once('reduce',function(){ console.log("减的方法触发了"); this.num-- }) 结果:减的方法只执行一次. $off关闭实例事件 关闭r.
  • uni.$emit、 uni.$on 、 uni.$once 、uni.$off 触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等 使用时,注意及时销毁事件监听,比如,页面 onLoad 里边 uni.$on 注册监听,onUnload..
  • E/flutter (19338): Once you have called dispose() on a Cart, it can no longer be used. 使用了已经disposed 的方法. 一开始我想不明白,这究竟是什么意思. 我做了个实验. 分别在三个地方 输出 问题对象 的id,...
  • 写一个eventEmitter类,包括on()、off()、once()、emit()方法 1.on(event, fn) 监听event 事件,事件触发时调用fn函数; 2.once(event, fn) 为指定事件注册一个单次监听器,单次监听器最多只触发一次,触发后立即...
  • v-on指令 作用:对页面的事件进行绑定监听 语法:v-on:事件类型=“事件处理的函数” //如果时间直接绑定函数名称, //那么默认会传递事件的对象作为函数的第一个参数event <button type="button" v-on:click=...
  • 1、on(event,fn):监听event事件,事件触发时调用fn函数; 2、once(event,fn):为指定事件注册一个单次监听器,单次监听器最多只触发一次,触发后立即解除监听器; 3、emit(event,arg1,arg2,arg3…):触发event事件...
  • Write-Once-Read-Many-Timesand Bipolar Resistive Switching Characteristics of TiN/HfO2/PtDevices Dependent on the Electroforming Polarity
  • 在IE里访问时会出现下面的这种错误: Warning: require_once(./libraries/common.inc.php) [function.require-once]: failed to open stream: No such file or directory in X:xxxxxxphpmyadminindex.php on line 34...
  • 会使开发人员决定创建 Web 应用程序而不是基于 Windows 的应用程序,为便于安装而牺牲了 Windows窗体丰富的用户界面响应性。对于使用 ClickOnce 部署的应用程序,您可以集这两种技术的优势于一身。 本教程开始会以...
  • js代码-蚂蚁金服前端面试题 // 题目 4:实现一个基本的 event-emitter。 class EE { emit(name, ...params) { ... // once 指只通知一次 ... on(name, func) { } off(name, func) { } }
  • eventBus.js import Vue from 'vue'; export const EventBus = new Vue(); components/Parent.vue <template> <div> 我是父组件 <Son><...vm.$on( event, callback )
  • 或者直接在uni-app官方网站直接搜uni.emit、uni.emit、 uni.emit、uni.on 、 uni.once、uni.once 、uni.once、uni.off 个人总结 uni.emit、uni.emit、 uni.emit、uni.on 就像是子组件想传参给父组件,从而调用父组件...
  • 一、vue2开发中$emit 、$on 、$once 、$off 的使用 简单概述: 1、vm.$emit(eventName,callback) $on(eventName,callback) 一般结合使用。使用$emit触发当前实例上的自定义事件(并将附加参数都传给监听器回调...
  • java.lang.IllegalArgumentException:Either use @Param on all parameters except Pageable and Sort typed once, or none at all @Modifying @Transactional @Query("update Post set vi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 327,198
精华内容 130,879
关键字:

once和on

友情链接: griddedprep.rar