据我所知,到目前为止,史诗般的模式是"行动,行动"。
我使用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-observable
或rxjs
的内容,
任何意见都会非常有帮助。
答案 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);
}
(并且还有其他细微差别二)。