2017-02-27 21 views
1

我正在使用WebRTC和Redux傳奇。一個要求是,我必須定義peerConnection.onicecandidateRedux Saga:如何調用yield +放入嵌套函數中?

function* createPeerConnection(action) { 
    ... 
    peerConnection = new RTCPeerConnection(servers); 

    peerConnection.onicecandidate = (event) => { 
    if (event.candidate) { 
     yield put({ type: videoSessionActions.SEND_LOCAL_CANDIDATE, payload: event.candidate }); 
    } 
    } 
} 

然而,yield put不在此方法的工作。我將如何改變這一點,以便它與傳說一起工作?

回答

0

希望事件通道可以幫助你:

import { eventChannel, END } from 'redux-saga'; 
import { put, take } from 'redux-saga/effects'; 

import { videoSessionActions } from '../???/constants'; 

const rtcChannel = servers => eventChannel(emitter => { 
    const peerConnection = new RTCPeerConnection(servers); 
    peerConnection.onicecandidate = event => { 
    if (event.candidate) { 
     emitter({type: videoSessionActions.SEND_LOCAL_CANDIDATE, payload: event.candidate}); 
    } 
    }; 
    return() => { 
    peerConnection.close(); 
    }; 
} 
// ,buffers.expanding(1024) ??? 
); 

function* createPeerConnection(servers) { 
    const ch = rtcChannel(servers); 

    while(true) { // eslint-disable-line no-constant-condition 
    const candidate = yield take(ch); 
    yield put(candidate); 
    } 
}