您提供了一个无效的对象,其中包含一个流。您可以提供Observable,Promise,Array或Iterable

时间:2017-06-19 14:28:26

标签: javascript promise rxjs observable

说我有以下功能参考:

const externalRequests = (params) => Rx.Observable.zip(
  externalApi1(params),
  externalApi2(params)
)

const internalDB = (params) => Rx.Observable.fromPromise(getStuffFromDB(params)

externalRequests返回一些形状:

{ _isScalar: false,
  source: 
   { _isScalar: false,
     source: { _isScalar: false, array: [Object], scheduler: undefined },
     operator: { project: [Object] } },
  operator: undefined }

可以.subscribe'到。

internalDB,当.then'd直接从数据库返回正确的数据时,如果包含在Rx.Observable.fromPromise中,则会返回一些形状:

{ _p: 
   { handle: 115,
     type: 'promise',
     className: 'Object',
     constructorFunction: { ref: 122 },
     protoObject: { ref: 123 },
     prototypeObject: { ref: 1 },
     status: 'pending',
     promiseValue: { ref: 1 },
     properties: [],
     internalProperties: [ [Object], [Object] ],
     text: '#<Promise>' },
  _s: {} }

,当.subscribe'直接返回类似内容时:

{ isStopped: false,
  observer: 
   { isStopped: false,
     _onNext: [Function: val],
     _onError: [Function: val],
     _onCompleted: [Function: val] },
  m: 
   { isDisposed: false,
     current: { isDisposed: false, current: null } } }

说我现在想把所有这些拼凑成一个流:所以我写了类似的东西:

Rx.Observable.zip(externalRequests, internalDB).mergeAll().subsribe(() => console.log('potato'))

并收到表格的例外情况: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

总结一下:将我的承诺作为Observable投出的正确方法是什么,以及如何合并/展平多个observable如上所述?

3 个答案:

答案 0 :(得分:1)

正如@martin所提到的,你给zip运算符赋予了函数,而不是可观察函数。

您需要使用所需的params调用这些函数才能使代码正常工作。

另外,我认为您不需要mergeAll调用,因为internalDBexternalRequests调用的结果只是可观察的,而不是更高阶的可观察量(包含可观察量的可观察量) )

Rx.Observable
  //    ▼ you need to call the functions in order to get their observables
  .zip(externalRequests(params), internalDB(params))
  .subscribe(() => console.log('potato'))

答案 1 :(得分:1)

通常是因为您从'rxjs / operators'导入了zip

您应该从“ rxjs / observable”导入zip

答案 2 :(得分:0)

我这样导入文件的错误...

import {loginEpic} from "./Epic";

和 我只是像这样纠正...

import loginEpic from "./Epic";