问题标签 [rxjs-pipeable-operators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
angular - 是否有用于创建/处理 HTTP 流的 RXJS 标准?
简而言之,我在使用 RXJS 时经常遇到障碍,因为几乎每个示例都依赖于恒定的数据流,而我发出的 HTTP 请求本质上是单一的。
我的常见场景是这样的:我有一个服务可以进行 API 调用并更新必要的消费者。在我看来,这就像简单的事件发射。订阅者连接并等待事件 - 一旦他们得到它,他们就会离开并单独做自己的事情。
我相信您知道,问题在于 HTTP 订阅在完成后立即终止,并且“连接”会立即触发它。这是我仍然难以理解的 RXJS 概念。
因此,当您对该方法进行并发调用时,消费者依赖于其他消费者、forkjoins 和异步地狱——我尝试了各种涉及主题、重播、共享地图的可憎行为。我最终决定了这样的事情:
感觉……不对。我知道像 mergeMap 这样的东西类似地处理内部订阅,高阶 observables 不是反模式,但我不禁认为我做错了。
内部订阅真的可以做到这一点吗?有没有办法让消费者等待 HTTP 请求而不对服务器进行冗余调用?
任何人都可以对这个问题有所了解吗?
javascript - RxJS“点”与“管道”抽象
由于这四个原因,RsJs 的操作员从“点”抽象变为“管道”抽象。如果运算符使用符号别名,这些原因是否也会得到解决?因此,与其在原型中添加一个名为的属性'myOp'
,如果名称是一个类似的符号Symbol('myOp')
怎么办?然后它可以被调用为
逐一论证:
任何导入补丁操作符的库都会为该库的所有使用者增加 Observable.prototype,从而创建盲依赖。如果图书馆取消了它们的使用,它们会在不知不觉中破坏其他所有人。使用 pipeables,您必须将所需的运算符导入到您使用它们的每个文件中。
该符号只会在模块通过加载时附加到原型require('myOp')
并且不会发生冲突,因为它是一个符号并且不会被删除。
直接修补到原型上的算子不能被 rollup 或 webpack 等工具“摇树”。可管道运算符将是因为它们只是直接从模块中提取的函数。
添加到原型中的符号不需要动摇,因为它们是根据需要一一导入的;如果该符号出现在原型上,那么任何导入它的人都在使用它。
任何类型的构建工具或 lint 规则都无法可靠地检测到正在导入应用程序的未使用运算符。这意味着您可能会导入扫描,但停止使用它,它仍会被添加到您的输出包中。使用 pipeable 运算符,如果您不使用它,lint 规则可以为您提取它。
已加载但未使用的符号很容易检测到;如果var MyOp = require('my-op')
并且MyOp
不使用,则 linter 可能会要求删除包,因此永远不会附加操作,因为永远不会加载模块。
功能组合很棒。构建自己的自定义运算符变得非常容易,现在它们可以工作并且看起来就像 rxjs 中的所有其他运算符一样。您不再需要扩展 Observable 或覆盖提升。
该模块my-op
将像这样声明运算符:
angular - 根据来自服务器的响应以角度类型转换多个响应
}
}
错误:将“LoginResponse”类型转换为“LoginErrorResponse”类型可能是一个错误,因为这两种类型都没有充分重叠。如果这是故意的,请先将表达式转换为“未知”。“LoginResponse”类型中缺少属性“代码”
我可以从服务器获得任何一个响应。我想根据服务器响应对响应进行类型转换,并且应该返回可观察到的响应。
angular - RxJs 条件去抖动和采样
根据来自其他流的值有条件地向流添加去抖动时间
以上来自一些服务
如果 animation$ 具有 true 值,则debounceTime
,sample
应该被跳过。
如何从动画 $ 中提取值并应用 if else 逻辑。
如果我能做到
rxjs - takeUntil 未能防止可观察到的排放
我正在尝试使用 Rxjs 和 mousedown、mouseup 和 mousemove 事件创建自己的单击、按住和拖动事件。我的尝试使用了许多以 mousedown 事件开头的流,每个流都有一个 takeUntil 来监听来自其他流的发射。基本上,一旦其中一个流“声明”了该操作(即通过了所有要求并发出了一个值),其他 observables 应该在没有排放的情况下完成。
我查看了其他答案,并认为它可能与运行异步的计时器有关,但它发生在不依赖计时器的流之间,例如拖动和单击。我一直在使用 rxjs v6 在 codesandbox.io 中玩耍。
takeUntil 也必须坐在内部 observables 上,因为我不希望外部 observables 运行一次并完成。
代码如下所示:
预期行为:
如果用户在 mousedown 事件的 1 秒内移动鼠标,则mouse_drag$
流应该开始发射并且mouse_Click$/mouse_Hold$
的内部 observables 应该完成(感谢takeUntil(mouse_drag$)
没有发射并等待下一次发射mouse_down$
。
如果鼠标按钮在不移动的情况下保持按下状态超过 1秒,则mouse_Hold$
应该发出并且mouse_drag$/mouse_click$
的内部 observable 应该完成(感谢takeUntil(mouse_Hold$)
没有发出并等待下一次发射mouse_down$
。
实际行为:当前mouse_Drag$
会发出,mouse_Hold$
一秒后mouse_Click$
会发出,松开按钮时会发出。
我的问题是为什么发射mouse_Drag$
流不会导致mouse_Hold$
andmouse_Click$
的内部 observable 完成而不发射?
angular - 地图运算符不返回正确的结果
很长一段时间以来,我一直在努力解决以下问题。
doc1、doc2 和 doc3 是
子集合。
第一个文件如下
第二个:
第三个遵循相同的模式
以下方法(使用 AngularFire)返回 RatePlan 数组的 observable
该方法是这样调用的:
但是,在执行时,它只返回第一个文档 (doc1) 的 rplans。
如何修改它以返回一个包含所有 3 个文档的 rplan 的数组?
谢谢
angular - 我应该如何将 v5 中管道中使用的合并转换为 v6
我正在查看此处提供的转换指南,我正在尝试按照本指南转换管道中使用的合并,但它不像更改之前那样工作。
这是我用来学习新合并的一段代码:
我试图做这样的事情:
但是在 chrome 的网络选项卡中,我收到了对 api 的调用,其查询等于表单的状态(有效或无效)。转换它的正确方法是什么?
angular - 如何将多个属性映射到Angular 6中的数组?
我有一个对象数组,例如:
并想将其映射到下面的内容以使用它Plotly
当然,我可以复制上面的管道来获取 y 值,但这将是不同的订阅。还有其他方法可以解决这个问题吗?
angular - 在 const angular 上创建泛型类型
我遇到了错误处理程序的问题。我正在尝试在我的服务中创建一个通用的 retryPipeline:当调用失败时,它会在抛出和错误之前重试 3 次。到现在为止还挺好。如果我将代码放在方法中,它会起作用,如下所示:
我试图提取管道内的代码来声明一个常量,然后在我的服务调用中调用常量:
但我收到此错误:
错误 TS2322:类型 'Observable<{}>' 不可分配给类型 'Observable'。类型“{}”缺少类型“Mun”的以下属性:id_mun、id_del、den
有什么方法可以创建一个可以分配给任何方法的通用 const,尽管该方法返回一个类型化的值?提前致谢
typescript - 打字稿方法返回未定义?
嗨,我有一个 Angular 5 应用程序。我有一个返回 undefined 的服务方法。这就是我想要做的。我有一个名为 cloneFlight 的函数。我正在调用返回值 undefined 的 flightService.getCampaignsToClone(this.flight) 。
getCampaignsToClone 的代码如下。
在 getCampaignsToClone 中,我正在进行一个返回 Observable 的 http 调用campaignService.getStatuses()。然后过滤掉其中的一些,然后我调用 getUnpaginatedCampaigns 这是另一个 http 调用。知道什么是编写此代码的最佳方法,以便该方法不会返回未定义。我想我可能没有使用 rxjs 运算符。有人可以帮我弄清楚。
太感谢了