Javascript RxJS:将第一个源排队,直到第二个源满足谓词

Javascript RxJS:将第一个源排队,直到第二个源满足谓词,javascript,reactjs,rxjs,react-redux,redux-observable,Javascript,Reactjs,Rxjs,React Redux,Redux Observable,如何使用RxJS实现此场景 当我想要获取一个用户(第一个来源)时,我需要检查互联网连接(第二个来源)。如果未连接internet,请将第一个源排队,直到internet重新打开。如果internet重新打开,则发射第一个源。我可以做后一个,但在第二个源为真之前,我无法弄清楚如何将第一个源排队 请在这里检查我的代码: const userEpic = action$ => action$.ofType(USER_REQUEST) .withLatestFrom(action$.o

如何使用RxJS实现此场景

当我想要获取一个用户(第一个来源)时,我需要检查互联网连接(第二个来源)。如果未连接internet,请将第一个源排队,直到internet重新打开。如果internet重新打开,则发射第一个源。我可以做后一个,但在第二个源为真之前,我无法弄清楚如何将第一个源排队

请在这里检查我的代码:

const userEpic = action$ =>
  action$.ofType(USER_REQUEST)
    .withLatestFrom(action$.ofType(CONNECTION))
    .filter(([first, second]) => second.value === true)
    .do(a => console.log('can fetch a user'))    
    .mapTo({ type: SUCCESS });

尝试
buffer()
存储用户请求,直到连接触发缓冲区刷新

const USER_REQUEST='USER_REQUEST';
const CONNECTION='CONNECTION';
const SUCCESS=‘SUCCESS’;
const requestUser=()=>({type:USER\u REQUEST});
常量连接=(x)=>({type:connection,value:x});
常量bufferedUserRequests$=(操作$,存储)=>
类型的操作$(用户请求)
.filter(x=>!store.getState().connectionStatus)
.buffer(类型(连接)的操作$)
常量unbufferedUserRequests$=(操作$,存储)=>
类型的操作$(用户请求)
.filter(x=>store.getState().connectionStatus)
.map(请求=>[request])
const userEpic=(action$,store)=>
可观察合并(
bufferedUserRequests$(操作$,存储),
unbufferedUserRequests$(操作$,存储)
)
.flatMap(bufferArray=>
bufferArray.map(请求=>Rx.Observable.of(请求))
)
.do(a=>console.log('can fetch a user'))
.mapTo({type:SUCCESS})
const reducer=(state={connectionStatus:false},action)=>{
开关(动作类型){
案例连接:
返回{…状态,连接状态:action.value}
违约:
返回状态;
}
};
//组件/App.js
const{connect}=ReactRedux;
let App=({requestUser,connection,connectionStatus})=>(
启动请求
Internet连接:{connectionStatus.toString()}

连接(错误)}>断开连接 连接(true)}>Connect ); App=连接( ({connectionStatus})=>({connectionStatus}), {requestUser,connection} )(App); //redux/configureStore.js const{Provider}=ReactRedux; const{createStore,applyMiddleware}=Redux; const{createEpicMiddleware}=ReduxObservable; const-epicMiddleware=createEpicMiddleware(userEpic); 常量存储=创建存储(减速机, applyMiddleware(epicMiddleware) ); //index.js ReactDOM.render( , document.getElementById('root')) );

尝试
buffer()
存储用户请求,直到连接触发缓冲区刷新

const USER_REQUEST='USER_REQUEST';
const CONNECTION='CONNECTION';
const SUCCESS=‘SUCCESS’;
const requestUser=()=>({type:USER\u REQUEST});
常量连接=(x)=>({type:connection,value:x});
常量bufferedUserRequests$=(操作$,存储)=>
类型的操作$(用户请求)
.filter(x=>!store.getState().connectionStatus)
.buffer(类型(连接)的操作$)
常量unbufferedUserRequests$=(操作$,存储)=>
类型的操作$(用户请求)
.filter(x=>store.getState().connectionStatus)
.map(请求=>[request])
const userEpic=(action$,store)=>
可观察合并(
bufferedUserRequests$(操作$,存储),
unbufferedUserRequests$(操作$,存储)
)
.flatMap(bufferArray=>
bufferArray.map(请求=>Rx.Observable.of(请求))
)
.do(a=>console.log('can fetch a user'))
.mapTo({type:SUCCESS})
const reducer=(state={connectionStatus:false},action)=>{
开关(动作类型){
案例连接:
返回{…状态,连接状态:action.value}
违约:
返回状态;
}
};
//组件/App.js
const{connect}=ReactRedux;
let App=({requestUser,connection,connectionStatus})=>(
启动请求
Internet连接:{connectionStatus.toString()}

连接(错误)}>断开连接 连接(true)}>Connect ); App=连接( ({connectionStatus})=>({connectionStatus}), {requestUser,connection} )(App); //redux/configureStore.js const{Provider}=ReactRedux; const{createStore,applyMiddleware}=Redux; const{createEpicMiddleware}=ReduxObservable; const-epicMiddleware=createEpicMiddleware(userEpic); 常量存储=创建存储(减速机, applyMiddleware(epicMiddleware) ); //index.js ReactDOM.render( , document.getElementById('root')) );


你好。你能进一步澄清这一点吗?示例代码似乎与描述不匹配(没有用户,没有互联网检查,行为似乎不相关,等等),很可能排队观察不是理想的解决方案,因此也尝试在没有该假设的情况下进行解释,如果可能:)嗨,抱歉,我修改了示例代码以反映描述。我还改进了jsbin代码。在jsbin中,单击,断开连接,然后启动请求,然后单击连接,我会看到控制台中的
可以获取用户。可以分派第一个源的最后一个值,或者更好地分派所有尚未发出的值。我查看了
buffer
操作符,但不知道如何缓冲第一个源代码。谢谢你看,嘿。你能进一步澄清这一点吗?示例代码似乎与描述不匹配(没有用户,没有互联网检查,行为似乎不相关,等等),很可能排队观察不是理想的解决方案,因此也尝试在没有该假设的情况下进行解释,如果可能:)嗨,抱歉,我修改了示例代码以反映描述。我还改进了jsbin代码。在jsbin中,单击,断开连接,然后启动请求,然后单击连接,我会看到控制台中的
可以获取用户。可以分派第一个源的最后一个值,或者更好地分派所有尚未发出的值。我查看了
buffer
操作符,但不知道如何缓冲第一个源代码。谢谢你的关注。谢谢@richard matsen。这就是我要找的。