使用 Request 模块在服务器端的 rxjx 中进行多次序列化调用

multiple serialise call in rxjx on server side using Request module

我必须在 NodeJs 中使用 request moduleRxJs Observable[=13 在服务器端进行多次序列化调用=]

我有 Url 个地址数组,例如 ['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()