假设我有以下函数引用:
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
直接从数据库中返回正确的数据时,当包裹在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'))
并收到以下形式的异常:
您在需要流的地方提供了一个无效对象。您可以提供 Observable、Promise、Array 或 Iterable。
总结一下:我将 promise 转换为 Observable 的正确方法是什么,以及如何像上面那样合并/展平多个 observable?
最佳答案
正如@martin 提到的,您将函数赋予了 zip
运算符,而不是可观察对象。
您需要使用所需的 params
调用这些函数,以使您的代码正常工作。
此外,我认为您不需要 mergeAll
调用,因为 internalDB
和 externalRequests
调用的结果只是可观察的,而不是高阶可观察量(包含可观察量的可观察量)
Rx.Observable
// ▼ you need to call the functions in order to get their observables
.zip(externalRequests(params), internalDB(params))
.subscribe(() => console.log('potato'))
关于javascript - 您在需要流的地方提供了一个无效对象。您可以提供 Observable、Promise、Array 或 Iterable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44633266/