【发布时间】:2017-03-20 07:08:57
【问题描述】:
我有一个包含 N 个(整数)url 的数组。我想发出网络请求。
要求
- 更新状态:我们开始发出网络请求
- 请求一个接一个
- 在每个 Web 请求之前,我们都会更新我们要调用哪个 URL 的状态。
- 更新状态:完成(收到所有网址后)
我想发出以下事件
- 从网址开始
- Emit: String: Staring web requests
循环开始(网址应该一个接一个地加载,而不是一次全部加载。数据一收到就发出)
- Emit: String: 加载 url N[i]
- Emit: Object: url N[i] 的数据
循环结束
- 发射:字符串:完成
以下是我的解决方案。我正在寻找更好的解决方案
https://jsbin.com/kotizid/edit?html,js,console
//Fake Webrequest. Returns a promise
function fakeWebrequest(url){
return new Promise(function(resolve){
console.log('Making Web request for: '+url);
setTimeout(function(){
resolve('RESPONSE: of: '+ url);
},500);
});
}
//Urls lists
//null added at end to indicate end. Its a hack
let urls$ = Rx.Observable.of(['url 1','url 2',null]);
//Status Update
let status1$= urls$.map(()=>'Start downloading...')
//Queue
let queue$ = urls$.flatMap((url)=>url)
.concatMap((url)=>{
if(url==null){
return Rx.Observable.of(null)
}
let status$= Rx.Observable.of(`Loading ${url}`);
let promise$= Rx.Observable.fromPromise(fakeWebrequest(url))
return status$.merge(promise$);
})
let finalSeq$ = status1$.merge(queue$);
finalSeq$.subscribe(function(res){
if(res==null){
//End
}else{
console.log(res);
}
})
我的代码有问题
- 在url末尾添加了null
- 订阅事件必须处理不同类型的数据,这意味着我必须添加 ifs 来猜测触发了哪个事件。例如,如果订阅中的 res 是字符串,则它必须是状态。如果它的空序列必须已经结束。
我正在寻找更好的解决方案。请提出建议。
【问题讨论】: