我有一个N(整数)网址数组。我想发布网络请求。
要求
我想发出以下事件
循环开始(网址应该一个接一个地加载,而不是一次全部加载。数据一收到就会发出)
循环结束
以下是我的解决方案。我正在寻找更好的解决方案
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);
}
})
我的代码出现问题
我正在寻找更好的解决方案。请建议。
答案 0 :(得分:1)
假设我正确理解了您的问题,可能的解决方案是:
const { Observable } = Rx;
// fake http request
function fakeWebrequest(url){
return Observable
.of(`RESPONSE: of: ${url}`)
.delay(500);
}
const urls = ['url 1','url 2'];
let requests$ = Observable.from(urls.map(url => fakeWebrequest(url)));
requests$
.concatAll()
.subscribe(
// next
res => {
console.log(res)
},
// error
_ => {},
// complete
_ => console.log('All requests ended')
);
输出如下:
RESPONSE: of: url 1
RESPONSE: of: url 2
All requests ended