Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何实现多事件火灾&;事件存储器(事件和承诺的特征组合) 我的要求_Javascript_Angularjs_Events_Promise - Fatal编程技术网

Javascript 如何实现多事件火灾&;事件存储器(事件和承诺的特征组合) 我的要求

Javascript 如何实现多事件火灾&;事件存储器(事件和承诺的特征组合) 我的要求,javascript,angularjs,events,promise,Javascript,Angularjs,Events,Promise,由于我的应用程序的异步架构,我正在寻找一个具有以下两个属性的“事件”系统: 事件应该能够触发多次(可以通过事件触发,但不能通过承诺触发) 当我开始监听已经触发的事件时,我希望侦听器立即触发一次(就像承诺一样) 原因是1。我希望能够多次触发很多事件(例如,某些数据的更新)。但是我想把这个和2结合起来。因此,如果在添加侦听器时已触发事件,则会立即调用此侦听器。这是因为我并不总是确定(我也不想确定)哪段代码首先运行 我的“解决方案” 我想出了以下解决办法。我在AngularJS应用程序中使用它,因此是

由于我的应用程序的异步架构,我正在寻找一个具有以下两个属性的“事件”系统:

  • 事件应该能够触发多次(可以通过事件触发,但不能通过承诺触发)
  • 当我开始监听已经触发的事件时,我希望侦听器立即触发一次(就像承诺一样)
  • 原因是1。我希望能够多次触发很多事件(例如,某些数据的更新)。但是我想把这个和2结合起来。因此,如果在添加侦听器时已触发事件,则会立即调用此侦听器。这是因为我并不总是确定(我也不想确定)哪段代码首先运行

    我的“解决方案” 我想出了以下解决办法。我在AngularJS应用程序中使用它,因此是AngularJS上下文,但这个问题通常适用于Javascript。注意,我简化了代码

    app.controller('AppCtrl', function(CustomEventEmitter){
    
        // Broadcast an event. No listener added so nothing happens
        CustomEventEmitter.broadcast('event');
    
        // Add the event listener. Because the event allready fired, the listener gets called immediatly
        CustomEventEmitter.on('event', function(){
            console.log('Event emitted');
        });
    
        // Broadcast an other event
        CustomEventEmitter.broadcast('event');
    
    });
    
    app.service('CustomEventEmitter', function(){
    
        var
            listeners = {},
            memory = [];
    
        this.broadcast = function(name){
    
            // The normal broadcasting of the event to the listener
            if(listeners[name]) {
                listeners[name].forEach(function(listener){
                    listener();
                });
            }
    
            // Push the event into the 'memory'
            memory.push(name);
        };
    
        this.on = function(name, listener){
    
            // The normal adding of the listener
            if(!listeners[name]) {
                listeners[name] = [];
            }
            listeners[name].push(listener);
    
            // If an event is already in memory, call the listener
            if(memory.indexOf(name) !== -1) {
                listener();
            }
    
        };
    
    });
    
    我的问题 我的问题是:

  • 针对我的需求的“最佳实践”解决方案是什么
  • 你觉得我的“解决方案”怎么样
  • 我是不是遗漏了一些显而易见的东西
  • 最后一个问题的原因是,在我看来,这是一种非常常见的设计范式,但我似乎无法找到以简单简洁的方式解决这一问题的最佳方法

    注 我知道这可以通过添加额外的代码来解决(例如,在添加侦听器之前,以其他方式检查您要侦听的事件是否已经发生),但这不是我想要的。

    A完全满足您的要求。这属于更广泛的功能反应式编程(FRP)范畴。JavaScript中最流行的两个库可能是


    这两种工具都提供了您所需要的特定工具,以及大量的替代工具。

    您签出了吗?我刚刚查看了Bacon.js,并在FAQ页面(//github.com/baconjs/Bacon.js/wiki/FAQ)上看到了这一点,不幸的是:“这里发生的事情是,当没有侦听器时,您的属性不会得到更新。在使用onValue添加实际侦听器之前,该属性未处于活动状态;它没有监听底层总线。它会忽略输入,直到有人感兴趣。因此,这一切都归结为所有培根流和属性的“懒惰”。这也是一个关键特性:当添加订阅者时,流自动“插入”到它们的源,当没有更多订阅者时,流自动“拔出”。“@Zjaaspoer:你有什么问题?不,你真的在找FRP图书馆。@Bergi:如果我完全忘记了,我很抱歉。但是我已经阅读了几个小时关于FRP的go to library(上面提到的Bacon.js),并且已经做了很多实验。但我看不出,使用这种编程技术,您如何能够满足需求2。也就是说,我希望触发一个事件,并在稍后时间开始侦听该事件,但仍然会收到事件发生的通知