RxJs:Web请求的顺序。什么';这是一个比我的更好的解决方案?
我有一个由N个(整数)URL组成的数组。我想提出网络请求 要求RxJs:Web请求的顺序。什么';这是一个比我的更好的解决方案?,rxjs,rxjs5,Rxjs,Rxjs5,我有一个由N个(整数)URL组成的数组。我想提出网络请求 要求 更新状态:我们开始发出web请求 要求一个接一个 在每个web请求之前,我们更新要调用的URL的状态 更新状态:完成(收到所有URL后) 我想发出以下事件 从URL开始 Emit:String:启动web请求 循环开始(URL应该一个接一个地加载,而不是一次全部加载。数据一收到就发出) 发出:字符串:加载url N[i] Emit:Object:url N[i]的数据 环端 发射:字符串:完成 以下是我的解决方案。我正在
- 从URL开始
- Emit:String:启动web请求
- 发出:字符串:加载url N[i]
- Emit:Object:url N[i]的数据
- 发射:字符串:完成
我正在寻找更好的解决办法。请提出建议。假设我正确理解了您的问题,可能的解决方案是:
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
它有两个问题。a> 一次发出所有web请求。b> 在发出web请求之前,我们将如何发出状态?因为不会一次发出所有请求。尝试在延迟之前将console.log放入do中。它只是创造了一个冷的可观测的,而不是马上触发的。你说的地位是什么意思?如果您想在每个请求之前记录类似“获取${url}的请求已启动”的内容,请将其放在do和console中。在(RESPONSE:of:${url}
)的响应之前记录它。
将控制台放在您的fakeWebrequest
中,您将发现它立即被调用。我所说的status
是指在发出每个web请求之前发出一个带有字符串的事件。您可以检查我的JSBIN链接,并尝试模拟相同的行为。JSBIn现在已关闭,因此您可能需要称重。该函数立即被调用:YES。但它只是返回一个可观察的。实际上,我可以想象,你将使用http.get(“…”)
或post、put等,而不是Observable.of
?好的,angular使用一个observable,在您订阅它之前,您的请求不会被触发。关键是,您“准备”了请求,但没有发出请求。是的,调用了函数,但没有立即调用可观察的“body”,而是按顺序为每个url调用-everythig都可以:)。这里是我的例子:let requests=this.meta.gallery2DImageFiles.map(photo=>{返回this.interiorService.uploadGallery2DImage(interiorId,photo.file);//这里创建了角度http observable});push(新的可观察对象(photo=>{…}));req.concatAll().subscribe(…)
RESPONSE: of: url 1
RESPONSE: of: url 2
All requests ended