2016-11-11 19 views
0

これまでのところ、叙事詩のパターンは「アクション内のアクション」です。奇妙な `Uncaught TypeError ::` Observable.fromNodeCallback`からストリームを返す際に、未知の型が返されました

私は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のメソッドの問題ではないかもしれないと思いますが、 コールバックから作成された他のオブザーバブルでこの問題が発生している可能性があります。

多分私はredux-observableまたはrxjsについて何かを誤解しているかもしれません。 意見は非常に参考になります。

答えて

0

受信したエラーはmergeMapからのもので、認識できるものは受信されていません。問題は、redux-observableで、v5ではなくRxJS v4を使用しようとしていることです。これは混乱するかもしれませんが、私は何が起こっているのか説明しようとします:

あなたはv5 Observableをv5 mergeMapに戻そうとします。そのため、失敗します。あなたのaction$.ofType().mergeMap()コードはRxJS v5のものです。なぜなら、それはredux-observablesがデフォルトで使用するものなのだからです。mergeMap(v5では何を呼びますが、v4では呼び出されません)。次に、v4のパッケージ名であるrxをインポートします(v5は現在rxjsの下に公開されていますが、jsサフィックスに注意してください)。 v5ではfromNodeCallbackの名前がbindNodeCallbackに変更されたため、これがv4であることが再度確認されました。

これを解決するには、v4を削除し、代わりにuse v5を削除することをおすすめします。しかし、あなたが実際にv4を使用する必要がある場合、私たちはredux-observableのためにアダプタをインストールし、redux-observable-adapter-rxjs-v4を使用する必要があります。あなたがそれを使用している場合、あなたの叙事詩に提供されたaction$は現在v4 Observableになります。つまりmergeMapflatMapに変更する必要があります。

関連する問題