2016-11-11 61 views
0

據我瞭解,到目前爲止,史詩的模式是「行動中,行動出」。從`Observable.fromNodeCallback`返回流時奇怪`未捕獲TypeError:未知類型返回`

我使用MeteorJS,需要遵循調用Meteor方法與服務器交互的約定。

看起來是這樣的:

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

所以我儘量處理好與史詩像這樣的異步副作用:

completedSubscribe is just an action creator: 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

爲了確保我的實際回報行動,

我打電話訂閱:

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, 的任何意見將是非常有幫助的。

回答

0

您收到的錯誤來自mergeMap,它沒有收到可識別的內容。問題在於,您正嘗試使用RxJS v4而不是v5,並且可以使用Redux-observable。因此,雖然這可能會讓人困惑,但我會嘗試解釋發生了什麼:

您嘗試將v4 Observable返回到v5 mergeMap,這就是它失敗的原因。您的action$.ofType().mergeMap()代碼來自RxJS v5,因爲這是默認情況下使用redux-observables的可能性,而mergeMap(在v5中調用的是flatMap,但在v4中不使用)。然後導入rx這是v4的軟件包名稱(v5當前是在rxjs下發布的,請注意js後綴)。在v5 fromNodeCallback更名爲bindNodeCallback,所以這再次證實這是v4。

爲了解決這個問題,我建議你完全刪除v4而不是use v5。但是,如果您實際上需要使用v4,則我們有一個適用於可觀察的redux的適配器,您將需要安裝和使用redux-observable-adapter-rxjs-v4。如果你使用它,那麼提供給你的史詩的action$ observable現在將是v4 Observable,這意味着你需要將mergeMap更改爲flatMap(並且兩者之間還有其他細微差別)。

相關問題