Skip to content
This repository has been archived by the owner on Nov 26, 2018. It is now read-only.

Commit

Permalink
fix(shareObservable): implement refCount like behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
gregberge committed Apr 25, 2017
1 parent 3c6d2fd commit 69efdf3
Showing 1 changed file with 19 additions and 12 deletions.
31 changes: 19 additions & 12 deletions src/utils/shareObservable.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,24 @@ import createObservable from './createObservable'

const shareObservable = (observable) => {
const observers = []
let emitted
let emitted = false
let lastValue

observable.subscribe({
next: (value) => {
emitted = true
lastValue = value
observers.forEach(o => o.next(value))
},
complete: value => observers.forEach(o => o.complete(value)),
error: error => observers.forEach(o => o.error(error)),
})
let subscription = null

return createObservable((observer) => {
observers.push(observer)

if (emitted) {
if (!subscription) {
subscription = observable.subscribe({
next: (value) => {
emitted = true
lastValue = value
observers.forEach(o => o.next(value))
},
complete: value => observers.forEach(o => o.complete(value)),
error: error => observers.forEach(o => o.error(error)),
})
} else if (emitted) {
observers.forEach(o => o.next(lastValue))
}

Expand All @@ -28,6 +29,12 @@ const shareObservable = (observable) => {
const index = observers.indexOf(observer)
if (index === -1) return
observers.splice(index, 1)

if (observers.length === 0) {
subscription.unsubscribe()
emitted = false
subscription = null
}
},
}
})
Expand Down

0 comments on commit 69efdf3

Please sign in to comment.