javascript - 如何订阅返回 rxjs observable 的类方法?

标签 javascript rxjs es6-class

我有一个类方法,它使用来自 rxjs 的BehaviourSubject 和 fromFetch 并返回一个可观察值。我正在尝试订阅类外的方法。

我可以console.log我得到的方法AnonymousSubject {_isScalar: false, Observers: Array(0), close: false, isStopped: false, hasError: false, ...}

export class Client {
  constructor(opts) {
    ...
  }
  request(operation) {
    const option$ = new BehaviorSubject(null)
    const body = JSON.stringify({
      query: operation.query,
      variables: operation.variables
    })
    option$.next(body)

    return option$.pipe(
      switchMap(body => {
        return fromFetch(url, {
          method: 'POST',
          body,
          headers: {
            'Content-Type': 'application/json',
            ...fetchOpts.headers
          },
          ...fetchOpts
        }).pipe(
          switchMap(response => {
            if (response.ok) {
              // OK return data
              return response.json()
            } else {
              // Server is returning a status requiring the client to try something else.
              return of({
                error: true,
                message: `Error ${response.status}`
              })
            }
          }),
          catchError(err => {
            // Network or other error, handle appropriately
            console.error(err)
            return of({ error: true, message: err.message })
          })
        )
      })
    )
  }
}

我想像这样调用方法并订阅它

let client = new Client({...})

function handleRequest(operations) {
  let data = client.request(operations)
  data.subscribe(...)
}

当我将 .subscribe 添加到数据时,它会抛出错误:Uncaught TypeError:您在需要流的地方提供了无效的对象。您可以提供 Observable、Promise、Array 或 Iterable。

最佳答案

问题是您正在返回简单的 response.json() 您应该从 switchMap 的 if ( response.ok) block - 请参阅下面的代码 -

export class Client {
  constructor(opts) {
    ...
  }
  request(operation) {
    const option$ = new BehaviorSubject(null)
    const body = JSON.stringify({
      query: operation.query,
      variables: operation.variables
    })
    option$.next(body)

    return option$.pipe(
      switchMap(body => {
        return fromFetch(url, {
          method: 'POST',
          body,
          headers: {
            'Content-Type': 'application/json',
            ...fetchOpts.headers
          },
          ...fetchOpts
        }).pipe(
          switchMap(response => {
            if (response.ok) {
              // OK return data
              return of(response.json())
            } else {
              // Server is returning a status requiring the client to try something else.
              return of({
                error: true,
                message: `Error ${response.status}`
              })
            }
          }),
          catchError(err => {
            // Network or other error, handle appropriately
            console.error(err)
            return of({ error: true, message: err.message })
          })
        )
      })
    )
  }
}

关于javascript - 如何订阅返回 rxjs observable 的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56552952/

相关文章:

javascript - 如何使用 ES6 类添加事件监听器并在 Canvas 中移动对象?

mysql - Node.js ES6 类私有(private)存储

javascript - 如何在纯 javascript 中检查一个元素是否有 ID?和条件语句问题

angular - 我如何拦截一个可观察对象以获得值并仍然返回一个可观察对象?

javascript - 在可观察订阅上运行函数

javascript - RXJS 订阅提供主题

javascript - 有没有办法从 Canvas 上清除一个元素而不消除其他元素?

javascript - 多个根处理程序的目的是什么?

javascript - 查找两个字符之间的文本,并为每个字符执行一些操作

Javascript 数组在 Pop 循环时插入内部