Неожиданное неопределенное возвращается как подписка из Observable, где ожидается объект - PullRequest
0 голосов
/ 03 февраля 2019

Я не могу найти проблему с кодом ниже, почему я получаю 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 голосов
/ 03 февраля 2019

Оператор 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...