Javascript RxJS:将第一个源排队,直到第二个源满足谓词
如何使用RxJS实现此场景 当我想要获取一个用户(第一个来源)时,我需要检查互联网连接(第二个来源)。如果未连接internet,请将第一个源排队,直到internet重新打开。如果internet重新打开,则发射第一个源。我可以做后一个,但在第二个源为真之前,我无法弄清楚如何将第一个源排队 请在这里检查我的代码: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
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。这就是我要找的。