Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在rxjs中优化两台服务器之间网络请求的顺序处理_Javascript_Rxjs - Fatal编程技术网

Javascript 如何在rxjs中优化两台服务器之间网络请求的顺序处理

Javascript 如何在rxjs中优化两台服务器之间网络请求的顺序处理,javascript,rxjs,Javascript,Rxjs,我想连续向Web服务器“A”发出数百个API请求,一个接一个地执行,以避免阻塞服务器。 对于来自此服务器的每个响应,我需要将此响应发送到Web服务器“B”进行处理,但条件是我不能一次向服务器B发送多个请求,但一次只能发送一个请求 注意:我不想在Web服务器B的请求仍处于挂起状态时延迟对Web服务器A的请求 我应该如何更改代码以满足这些条件?(我当前的代码忽略了不同时向Web服务器B发送多个请求的条件) 这里可以有一种方法: from(requestsToA) .烟斗( //按顺序发送所有请求 c

我想连续向Web服务器“A”发出数百个API请求,一个接一个地执行,以避免阻塞服务器。 对于来自此服务器的每个响应,我需要将此响应发送到Web服务器“B”进行处理,但条件是我不能一次向服务器B发送多个请求,但一次只能发送一个请求

注意:我不想在Web服务器B的请求仍处于挂起状态时延迟对Web服务器A的请求

我应该如何更改代码以满足这些条件?(我当前的代码忽略了不同时向Web服务器B发送多个请求的条件)


这里可以有一种方法:

from(requestsToA)
.烟斗(
//按顺序发送所有请求
concatAll(),
//将每个'aResponse'发送到'B',仍然按顺序发送
concatMap(aResponse=>service.sendResponseObserver(aResponse))
)

如果
aResponse2
在为
aResponse1
创建的内部可观察对象完成之前到达,它将被添加到队列中,并在可观察对象完成时从队列中删除,因此您可以确保每个请求一次发送一次。

您真了不起
import { from, of, defer } from 'rxjs';
import { concatAll } from 'rxjs/operators'

const source = defer(() => {

  const webserverA_req1 = defer(() => {
    return new Promise(resolve => {
      console.log('webserver A request #1 run');
      setTimeout(() => {
        resolve('a')
      }, 500) 
    });
  });

  const webserverA_req2 = defer(() => {
    return new Promise(resolve => {
      console.log('webserver A request #2 run');
      setTimeout(() => {
        resolve('b')
      }, 2500)
    });
  });

  const webserverA_req3 = defer(() => {
    return new Promise(resolve => {
      console.log('webserver A request #3 run');
      setTimeout(() => {
        resolve('c')
      }, 3000)
    })
  });
  
  return from([
    webserverA_req1,
    webserverA_req2, 
    webserverA_req3
  ])
    .pipe(
      concatAll((msg) => of(msg))
    )
});

const webserverB_req = (x) => {
  return new Promise(resolve => {
    console.log('webserver B request run');
    setTimeout(() => {
      // console.log(x);
      resolve(x + ' processed')
    }, 9000)
  })
};

source.subscribe(
  x => {
    webserverB_req(x);
  },
  err => console.log(err),
  () => console.log('complete')
)