0

据我所知,史诗的模式是“行动,行动”。

我使用 MeteorJS,需要遵循调用 Meteor 方法与服务器交互的约定。

看起来像这样:

Meteor.call("<function-name>", ...args, callback)

所以我尝试用这样的史诗来处理异步副作用:

completedSubscribe只是一个动作创建者: const completedSubscribe = result => {type: SUCCEED, result}

import { Observable } from 'rx'

const fromMeteorCall = Observable.fromNodeCallback(Meteor.call)
const subscriptionsEpic = action$ =>
    action$.ofType(REQUEST_SUBSCRIBE)
        .mergeMap(action => {
            const call$ = fromMeteorCall('subscriptions.insert', action.email)
            return call$.map(completedSubscribe)
        })

然后我得到错误:Uncaught TypeError: unknown type returned

为了确保我实际返回动作出来,

我尝试调用 subscribe :

call$.subscribe(
  function (x) { console.log('onNext: success!'); },
  function (e) { console.log('onError: %s', e); },
  function ()  { console.log('onCompleted'); }
);

然后订阅完美,

但史诗仍然无法工作并继续抛出Uncaught TypeError: unknown type returned.

我认为这可能不是 MeteorJS 的方法问题,这可能发生在从回调创建的其他 observable 中。

也许我误解了redux-observableor rxjs,任何意见都会非常有帮助。

4

1 回答 1

0

您收到的错误来自mergeMap,它没有收到它识别的东西。问题是您正在尝试使用带有 redux-observable 的 RxJS v4,而不是 v5。因此,虽然这可能令人困惑,但我将尝试解释正在发生的事情:

您尝试将 v4 Observable 返回到 v5 mergeMap,这就是它失败的原因。您的action$.ofType().mergeMap()代码来自 RxJS v5,因为这是 redux-observables 默认使用的,并且mergeMapflatMap在 v5 中调用但在 v4 中没有调用)。然后你 importrx是 v4 的包名(v5 目前发布在 下rxjs,注意 js 后缀)。在 v5fromNodeCallback中被重命名bindNodeCallback,所以这再次确认这是 v4。

为了解决这个问题,我建议您删除 v4 并完全使用 v5。但是,如果您确实需要使用 v4,我们有一个用于 redux-observable 的适配器,您需要安装和使用redux-observable-adapter-rxjs-v4。如果您使用它,action$提供给您的史诗的 observable 现在将是 v4 Observable,这意味着您需要将其更改mergeMapflatMap(并且两者之间还有其他细微差别)。

于 2016-11-11T19:07:45.323 回答