Ryan Chandler 5 лет назад
Родитель
Сommit
c59af3d156
9 измененных файлов с 42 добавлено и 4 удалено
  1. 0 0
      dist/spruce.js
  2. 0 0
      dist/spruce.js.map
  3. 0 0
      dist/spruce.module.js
  4. 0 0
      dist/spruce.module.js.map
  5. 0 0
      dist/spruce.umd.js
  6. 0 0
      dist/spruce.umd.js.map
  7. 12 4
      src/bus.js
  8. 4 0
      src/index.js
  9. 26 0
      tests/bus.spec.js

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/spruce.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/spruce.js.map


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/spruce.module.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/spruce.module.js.map


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
dist/spruce.umd.js


Разница между файлами не показана из-за своего большого размера
+ 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', () => {

Некоторые файлы не были показаны из-за большого количества измененных файлов