Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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_Reactivex - Fatal编程技术网

Javascript RxJs在订阅中获取原始事件而不向下传递

Javascript RxJs在订阅中获取原始事件而不向下传递,javascript,rxjs,reactivex,Javascript,Rxjs,Reactivex,解释标题的一段小伪代码: Subject source = new Subject(); function sendInNewResource(newNumber, anotherVariable) { source.next(newNumber); } const newSource = source .map((myNumber) => myNumber++); newSource.subscribe((data) =&

解释标题的一段小伪代码:

   Subject source = new Subject();

   function sendInNewResource(newNumber, anotherVariable) {
       source.next(newNumber);   
   }

   const newSource = source
     .map((myNumber) => myNumber++);

   newSource.subscribe((data) => {
       //How can I access myObject here?
   });

   sendInNewResource(1, {myObject});
我认为伪代码解释了我想做的一些事情。 到目前为止,我已经尝试过扩展可观察对象,但是如果我这样做了,看起来我需要覆盖可观察对象中的操作符

我几乎想为活动提供元数据

我不想传递myObject,因为这是一个供外部使用的库,我将在我的代码库中订阅可观察对象,但链接可观察对象将在外部完成

有人对如何实现这一目标有什么想法吗

就上下文而言, 我正在尝试创建一个纯RxJs http库,它将允许我执行以下操作:

const server$ = RxHttpServer(server)

const api$ = server.filter((request) => request.url.startsWith('/api'));

const apiEndpoint$ = api.map(() => ({
   status: 400,
   body: 'this is an api endpoint',
   headers: {
   }
}));

// Inside my library, note the use of the response object that I don't have access to:
apiEndpoint.subscribe((dataToSend) => response.write(dataToSend))

这些对象的内部逻辑和处理已经编写好,只需要将响应对象发送回。

您可以使用
responseFor
帮助器,它将获取响应元数据并返回响应主题的可观察对象,每个HTTP请求一个。库用户可以订阅它并将数据写入每个响应主题。而在库中,您可以订阅相同的响应主题,并在完成后将其发送回客户端。比如:

// even better extending the Observable prototype
// const apiEndpoint$ = api$.mapResponseFor(...
const apiEndpoint$ = api$.map(responseFor({
   status: 400,
   body: 'this is an api endpoint',
   headers: {}
}));

apiEndpoint$.subscribe(response => {
  response.next(data)
  response.complete()
})

我对RxJS的了解是有限的,但是,您不需要将myObject作为参数传递给next吗
source.next(newNumber,myObject)
如果这不可能,你可以做一些参数解构
source.next({newNumber,myObject})
@Baruch,这是我在这篇文章中试图避免的一件事,因为我不希望框架的用户必须为他们所做的每一个链向下传递响应。如果你想象一个端点通过一个平面图调用另一个端点,你马上就失去了响应,或者必须到处使用选择器函数,对我来说,它会破坏一个可用性:)你会考虑包装一个可观察的“<代码>响应< /代码>对象吗?在这种情况下,您可以同时使用
combinelatetest
apidendpoint$
response$
,然后在回调中访问这两个。@atomrc,我想你可以这样做,但我不完全确定这会是什么样子,因为你会为每个请求创建一个新的可观察对象,响应究竟来自哪里?根据创建主题的方式,您可以创建一个主题,并将每个
响应
反馈给该主题。也许我不太理解您的意思,但响应类型的主题不会真正起作用-如果我们有一个需要2秒才能响应的请求和另一个可以立即处理的请求,第一个(慢速请求)将由第二个可观察对象处理。再说一次,也许我完全弄错了,方法的响应会做什么?:)这取决于apiEndpoint$观察者的操作。如果变慢意味着进行其他异步调用并在之后完成响应,那么就可以了。异步调用将被调度,javascript将立即从第一个观察者的代码返回,并为下一个观察者提供服务。如果慢意味着实际计算,第一个观察者将阻塞,第二个观察者将不被服务。但是javascript是单线程的,这总是一个问题。您需要一些特定于平台的并发方式,也就是说,您可以将处理代码包装到Web Worker中。另外,您可以对每个响应主题调用
responseSubject.observeOn(Rx.scheduler.async)
。这将确保当用户执行
response.next(data)
时,它不会同步执行,给其他观察者一些时间进行处理。尽管如此,如果计算
数据的计算是同步且长的(就像在代码中有一个睡眠),它仍然会阻塞主javascript线程。