从Observable返回意外的未定义作为预订的订阅,其中对象是预期的

时间:2019-02-03 13:29:49

标签: javascript observable

我找不到下面的代码的问题,为什么返回定义了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)

1 个答案:

答案 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)