奇怪的`Uncaught TypeError:从`Observable.fromNodeCallback`

时间:2016-11-11 10:23:58

标签: meteor rxjs redux-observable

据我所知,到目前为止,史诗般的模式是"行动,行动"。

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

看起来像这样:

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

所以我尝试用epic来处理异步副作用:

  

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-observablerxjs的内容, 任何意见都会非常有帮助。

1 个答案:

答案 0 :(得分:0)

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

您尝试将v4 Observable返回到v5 mergeMap,这就是失败的原因。您的action$.ofType().mergeMap()代码来自RxJS v5,因为这是redux-observables默认使用的内容,mergeMap(在v5中调用flatMap但在v4中调用的不是rx。然后导入rxjs,即v4的包名(v5当前在fromNodeCallback下发布,请注意js后缀)。在第5版中,bindNodeCallback被重命名为action$,因此再次确认这是v4。

要解决此问题,建议您完全删除v4,而不是use v5。但是,如果您确实需要使用v4,我们有一个适用于redux-observable的适配器,您需要安装并使用redux-observable-adapter-rxjs-v4。如果您使用它,提供给您的史诗的mergeMap可观察量现在将是v4 Observable,这意味着您需要将flatMap更改为#include <boost/python.hpp> char const* yay() { return "Yay!"; } BOOST_PYTHON_MODULE(libyay) { using namespace boost::python; def("yay", yay); } (并且还有其他细微差别二)。