我必须使用request module和 RxJs Observable
在 NodeJs 中的服务器端进行多个序列化调用我有一组网址地址,例如['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')}
})
如何为此使用Forkjoin
答案 0 :(得分:0)
您可以将每个URL转换为Observable,然后使用forkJoin
等待所有URL解析:
import * as request from 'request';
import { bindNodeCallback, forkJoin } from 'rxjs';
const requestAsObservable = bindNodeCallback(request.get);
const observables = addressesArray.map(url => requestAsObservable(url));
forkJoin(...observables)
.subscribe(console.log);
您也可以使用request-promise
包来返回Promises,而不必使用bindNodeCallback
来包装request
。