等效于rxjs中的循环

时间:2018-11-09 19:15:17

标签: rxjs

相当于什么

#!/bin/bash
# description: show first/last lines of all the files in a provided directory

if [ $# -ne 3 ]
then
        echo "Error: Please provide 3 parameters."
        echo "Usage Example: lshead -head 5 [DIR]"
        exit
else
        operation=$1
        lines=$2
        directory=$3

        if [ "$operation" == "-head" ]
        then
                head -n $lines  $directory/*
        elif [ "$operation" == "-tail" ]
        then
                tail -n $lines $directory/*
        fi
fi

在rxjs中?

此刻我像这样“解决”了

array.forEach(element => {
  array.forEach(element2 => {
    //do something with element and element2
  });
});

switchMap(array => from(array).pipe(
  tap(element => {
    array.forEach(element2 => {
      //do something with element and element2
    })
  })
)

(在真实代码let globalArray = [...someObjects]; of(globalArray).pipe( mergeMap(array => array), tap(element => { globalArray.forEach(element2 => { //do something with element and element2 }) }) ) 中是一个传递给函数的数组)

但是在rxjs中这并不是正确的方法。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,mergeMap是您要找的运营商。

mergeMap需要一个返回ObservableInput的函数作为其第一个参数。数组是一个ObservableInput。返回数组时,mergeMap将数组展平并发出每个项作为单独的通知。

所以下面的代码应该可以满足您的需求

of(arrayOfArraysOfNumbers)
.pipe(
  mergeMap(arrayOfArrays => arrayOfArrays),
  mergeMap(array => array)
)
.subscribe(console.log)

这里是example

更新-两次阵列重复出现

其中您必须循环相同的数组两次,您可能会看到类似的情况

function closureForArray(arrayOfElements: Array<any>) {
  return from(arrayOfElements).pipe(
    mergeMap(e1 => from(arrayOfElements).pipe(
      map(e2 => ({e1, e2}))
    ))
  )
}

of(arrayOfElements)
.pipe(
  switchMap(closureForArray),
  map(({e1, e2}) => // do something with e1 and e2)
)

这里的基本思想是closureForArray函数将arrayOfElements保留在范围内,因此可以两次应用from RxJS函数,一个运行第一个循环,另一个运行第一个循环。从第一个循环开始的第二个循环。

updated example