使用请求模块在服务器端的 RXJX 中进行多次序列化调用



我必须使用请求模块在 NodeJs 的服务器端进行多次序列化调用,并且RxJs 可观察

我有一系列网址地址,如['www.google.com','facebook.com'] 当我发出调用请求时,服务器在事件循环中变得繁忙。我想知道我的最后一个 url 调用何时得到响应,以便我可以将响应发送到前端 这是我到目前为止的代码

const foo = Observable.create(function (observer) {
res.writeHeader(200, { "Content-Type": "text/html" });
var str = '<html><head></head><body><h1> Following are the responses: </h1><ul>'
res.write(str);
let count = 0;
addressesArray.forEach(function (element, i) {
observer.next(element);
if (some Condition) {
console.log('here i want to call complete when I get last response')     
// observer.complete();   
}

})
}) 

这是我的订阅功能

const subscription = foo.subscribe({
next : addres =>
{
request(addres , function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(response)

}
if (typeof response === "undefined" || typeof body === "undefined") {
console.log('No resp')
}
})
},
complete:()=>{console.log('done')}

})

您可以使用from运算符从addressesArray开始您的 Observable,当它到达数组末尾时,它将自行完成

from(addressesArray).pipe(
mergeMap(address => {
return new Observable(obs => {
request(address, function (error, response, body) {
if (!error && response.statusCode == 200)
obs.next(response)
else
obs.next('')
obs.complete()
})
})
}),
reduce((allResponses, response) => {
return allResponse += '<li>' + response + '<li/>'
}, ''),
tap(allResponses => {
res.writeHeader(200, { "Content-Type": "text/html" });
var str = '<html><head></head><body><h1> Following are the responses: </h1><ul>'
res.write(allResponses + '</ul')
res.end()
})
).subscribe()

最新更新