rx 指南说尽可能避免副作用,如果不可避免,请将它们放在 do()(js 中的 doAction)子句中。

然而,UI 中一个非常常见的副作用是创建一些在下游(由子小部件)引用的资源(例如

)。您必须捕获这些资源的句柄,以便可以传递它们。例如。如果您有一个数据数组,每个数据都需要一个 div,您将为每个数据创建一个 div,并将这些 div 的句柄传递给子级。

但是 doAction() 会丢弃副作用的返回值,因此您无法捕获创建的对象的句柄。您必须在 select() 中执行副作用。

我看这一切都错了吗?创建的资源是有状态的,并且会产生副作用。您想要流中的状态,但不能将它放入流中而不将副作用放入 select() 中,这是禁忌的。

最佳答案

请记住,它们只是指导方针。如果您希望在选择功能时产生副作用,并且您了解它将如何使用,那么就去做吧。

但是……您是否考虑过创建分离元素并仅将它们附加到订阅回调中的文档?换句话说,副作用不是资源的创建。只有当你对资源做一些事情时。我用过这种模式几次...

$(someElement).onAsObservable("click")
    .select(function(ev) {
            return $("<div>");
     })
     ...do stuff to detached div
     .subscribe(function($el) {
          // finally attach it
          $(container).append($el);
     });

关于javascript - 在 rx 中创建资源的副作用(响应式(Reactive)扩展),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21617433/

10-12 13:03