是的!您找到了处理数组流的正确方法。
// CORRECT :)
const facilityVDom$ = facilityResponse$.map(facilities => // <- this is an array
ul( // <- notice no brackets here, because you already have an array
facilities.map(f => li(f.id)) // <- ...and array map returns an array
)
);
然而,这不是列表问题的困难。
随着时间的推移,STREAMS就像数组,将它们视为数组很有用,但它们不是ARRAYS,并且不能与数组互换。仅在 STREAM 上下文中使用流,并且仅在 ARRAY 上下文中使用数组 - 因此您的第一次尝试会出现问题:
// WRONG :(
const vdom$ = form$.map(form =>
div([ // <-- the `div` function can take an ARRAY of VDOMs as parameter
facilityResponse$.map(res => p(res.id)), // <-- this is a STREAM, not a VDOM
])
);
您在这里有两个错误:1)您在数组上下文中使用了流,2)您将您认为可以与数组互换的内容包装在数组中。因此,您提供给div
函数的参数是一个包含一个元素的数组,并且该元素是一个流,而不是 VDOM 对象。
提供给div
(或类似)函数的 ARRAY 必须包含 VDOM 对象(或返回 VDOM 对象的函数)。如:
div( [ p('1'), p('2'), p('3') ] ) // OR
div( [1,2,3].map(ii => p(ii)) ) // OR
let arr = [1,2,3]
div( arr.map(ii => p(ii)) )
STREAM 上的map
方法采用一个函数,该函数将您从流上下文中切换出来。您实际上可以在此函数中使用流,但它们通常没有用,并且永远不能与数组互换。
stream$.map( // <- stream
function (elem) { // <- leaving stream
// regular javascript here
// transform each element of the stream
// and return it to the stream
return elem
}
) // <- back to stream