Przeglądaj źródła

feature(Spruce.once())

Ryan Chandler 5 lat temu
rodzic
commit
c59af3d156

Plik diff jest za duży
+ 0 - 0
dist/spruce.js


Plik diff jest za duży
+ 0 - 0
dist/spruce.js.map


Plik diff jest za duży
+ 0 - 0
dist/spruce.module.js


Plik diff jest za duży
+ 0 - 0
dist/spruce.module.js.map


Plik diff jest za duży
+ 0 - 0
dist/spruce.umd.js


Plik diff jest za duży
+ 0 - 0
dist/spruce.umd.js.map


+ 12 - 4
src/bus.js

@@ -3,26 +3,34 @@ export default {
 
     events: {},
 
-    on(name, callback) {
+    on(name, callback, once = false) {
         if (! this.events[name]) {
             this.events[name] = []
         }
 
-        this.events[name].push(callback)
+        this.events[name].push({ callback, once })
 
         return () => this.off(name, callback)
     },
 
+    once(name, callback) {
+        this.on(name, callback, true)
+    },
+
     off(name, callback) {
         this.events[name] = this.events[name].filter(registerCallback => {
-            return registerCallback !== callback
+            return registerCallback.callback !== callback && registerCallback.once !== true
         })
     },
 
     emit(name, data = {}) {
         if (this.events[name]) {
             this.events[name].forEach(callback => {
-                callback(data)
+                callback.callback(data)
+
+                if (callback.once) {
+                    this.off(name, callback)
+                }
             })
         }
 

+ 4 - 0
src/index.js

@@ -78,6 +78,10 @@ const Spruce = {
         return this.events.on(name, callback)
     },
 
+    once(name, callback) {
+        return this.events.once(name, callback)
+    },
+
     off(name, callback) {
         this.events.off(name, callback)
     },

+ 26 - 0
tests/bus.spec.js

@@ -34,6 +34,32 @@ test('.on() > listener can access store', () => {
     expect(fixture.store).toEqual(Spruce.stores)
 })
 
+/* Spruce.once() */
+
+test('.once() > can be used to register event listeners', () => {
+    Spruce.once('once', (event) => {})
+
+    expect(Spruce.events.events.hasOwnProperty('once')).toBeTruthy()
+})
+
+test('.once() > will unhook listener after first run', () => {
+    let fixture = 0
+
+    Spruce.once('once', (event) => {
+        fixture += 10
+    })
+
+    expect(fixture).toEqual(0)
+
+    Spruce.emit('once')
+
+    expect(fixture).toEqual(10)
+
+    Spruce.emit('once')
+
+    expect(fixture).toEqual(10)
+})
+
 /* Spruce.emit() */
 
 test('.emit() > will run registered listeners', () => {

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików