2017-05-09 61 views
2

我正在使用具有非常特定的API的WebRTC庫。該peerConnection.setRemoteDescription方法的第二個參數應該是當它完成設置遠程描述回調:Redux Observable:如何從回調中返回一個動作?

這是我的WebRTC類的我的包裝功能之一:

export function setRemoteSdp(peerConnection, sdp, callback) { 
    if (!sdp) return; 
    return peerConnection.setRemoteDescription(
    new RTCSessionDescription(sdp), 
    callback, // <------------- 
); 
} 

這是一個小品是什麼我想要做的:

function receivedSdp(action$, store) { 
    return action$.ofType(VideoStream.RECEIVED_SDP) 
    .mergeMap(action => { 
     const {peerConnection} = store.getState().videoStreams; 
     const {sdp} = action.payload; 

     return WebRTC.setRemoteSdp(peerConnection, sdp,() => { 
     return myReducer.myAction(); // <------ return action as the callback 
     }) 
    }) 
}; 

這不起作用,因爲我沒有返回Observable。有沒有辦法做到這一點?

P.S.這是WebRTC API:https://github.com/oney/react-native-webrtc/blob/master/RTCPeerConnection.js#L176

回答

2

所以問題是,setRemoteSdp不會返回Observable,而myReducer.myAction()會這樣做,這就是您要合併的Observable?

您可以使用Observable.create,敷WebRTC.setRemoteSdp電話:

.mergeMap(action => { 
    return Observable.create(observer => { 
    WebRTC.setRemoteSdp(peerConnection, sdp,() => { 
     observer.next(myReducer.myAction()); 
     observer.complete(); 
    }) 
    }); 
} 
.mergeAll() 

Observable.create返回一個可觀察到發射另一個可觀測從myReducer.myAction()。現在我實際上所謂的高階,我想用mergeAll()展平(concatAll也可以)。

+0

天才! Observable.create是我一直在尋找的。感謝martin – Edmund

+0

@martin嗯爲什麼它需要'mergeAll'? 'mergeMap'會使返回的自定義Observable變平,它只發出POJO動作? – jayphelps

1

馬丁的回答是關於使用Observable.createnew Observable --same事情正確的(除了它的,我不清楚爲什麼你需要自mergeMapmergeAll()會拉平?)

作爲獎勵,你也可以使用Observable.bindCallback爲這個。

// bindCallback is a factory factory, it creates a function that 
// when called with any arguments will return an Observable that 
// wraps setRemoteSdp, handling the callback portion for you. 
// I'm using setRemoteSdp.bind(WebRTC) because I don't know 
// if setRemoteSdp requires its calling context to be WebRTC 
// so it's "just in case". It might not be needed. 
const setRemoteSdpObservable = Observable.bindCallback(WebRTC.setRemoteSdp.bind(WebRTC)); 

setRemoteSdpObservable(peerConnection, sdp) 
    .subscribe(d => console.log(d)); 

你的史詩裏的用法是這樣的

// observables are lazy, so defining this outside of our epic 
// is totally cool--it only sets up the factory 
const setRemoteSdpObservable = Observable.bindCallback(WebRTC.setRemoteSdp.bind(WebRTC)); 

function receivedSdp(action$, store) { 
    return action$.ofType(VideoStream.RECEIVED_SDP) 
    .mergeMap(action => { 
     const {peerConnection} = store.getState().videoStreams; 
     const {sdp} = action.payload; 

     return setRemoteSdpObservable(peerConnection) 
     .map(result => myReducer.myAction()); 
    }) 
}; 

您可以使用它來創建所有的WebRTC的API可觀察包裝。

相關問題