我找不到下面的代码的问题,为什么返回定义了undefined
方法的对象时却得到unsubscribe
的订阅。忽略map()
,因为我直接在这里直接调用静态fromTimeout
。
class Observable {
constructor(subscribe) {
this._subscribe = subscribe
}
// Expose public api method for observers to use...
subscribe(observer) {
this._subscribe(observer)
}
static fromTimeout(time) {
return new Observable(function(observer) {
let handler = function() {
observer.next("next value")
observer.complete()
}
const timeout = setTimeout(handler, time)
return {
unsubscribe: function() {
clearTimeout(timeout)
}
}
})
}
map(projection) {
const self = this
return new Observable(function(observer) {
const subscription = self.subscribe({
next: function(value) {
observer.next(projection(value))
},
complete: function() {
observer.complete()
}
})
return subscription
})
}
}
const obs1 = Observable.fromTimeout(500)
const subscription = obs1
// .map(v => v.toUpperCase())
.subscribe({
next: function(value) {
console.log("next: ", value)
},
complete: function() {
console.log("complete called")
}
})
setTimeout(function() {
console.log(subscription) // WHY undefined!?
subscription.unsubscribe()
}, 1000)
答案 0 :(得分:2)
在return
语句中缺少:
subscribe(observer) {
return this._subscribe(observer)
}
class Observable {
constructor(subscribe) {
this._subscribe = subscribe
}
// Expose public api method for observers to use...
subscribe(observer) {
return this._subscribe(observer)
}
static fromTimeout(time) {
return new Observable(function(observer) {
let handler = function() {
observer.next("next value")
observer.complete()
}
const timeout = setTimeout(handler, time)
return {
unsubscribe: function() {
clearTimeout(timeout)
}
}
})
}
map(projection) {
const self = this
return new Observable(function(observer) {
const subscription = self.subscribe({
next: function(value) {
observer.next(projection(value))
},
complete: function() {
observer.complete()
}
})
return subscription
})
}
}
const obs1 = Observable.fromTimeout(500)
const subscription = obs1
// .map(v => v.toUpperCase())
.subscribe({
next: function(value) {
console.log("next: ", value)
},
complete: function() {
console.log("complete called")
}
})
setTimeout(function() {
console.log(subscription) // WHY undefined!?
subscription.unsubscribe()
}, 1000)