rxJs扫描-如果observable为空,则不会发射

时间:2018-09-03 06:06:05

标签: rxjs

我有一些看起来像这样的代码:

function getEvensSquared(array) {
  return rxjs.of(array).pipe(
    rxjs.operators.flatMap(array => {
      return rxjs.from(
        array.filter(n => n % 2 === 0)
      );
    }),
    rxjs.operators.switchMap(n => {
      return rxjs.of(n * n);
    }),
    rxjs.operators.scan((acc, cur) => {
      acc.push(cur);
      return acc;
    }, [])
  );
}

getEvensSquared([1, 2, 3, 4]).subscribe(v => {
  console.log("1,2,3,4");
  console.log(v)
});

getEvensSquared([1, 3, 5]).subscribe(v => {
  console.log("1,3,5"); //never prints
  console.log(v)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.2/rxjs.umd.min.js"></script>

本质上是:

  1. 获取ObjectA数组流。
  2. 将数组转换为经过过滤的ObjectA流。
  3. ObjectA的流转换为ObjectB的流。
  4. ObjectB的流累积到ObjectB的数组流中。

问题是-如果没有批准的预订,则flatMap操作员将不会发出通知。在这种情况下有没有默认的方法?

我尝试将defaultIfEmpty([])放在扫描之后-但这没用。

1 个答案:

答案 0 :(得分:0)

将此作为答案-因为它适用于我给出的示例-defaultIfEmpty在这种情况下确实有效。

function getEvensSquared(array) {
  return rxjs.of(array).pipe(
    rxjs.operators.flatMap(array => {
      return rxjs.from(
        array.filter(n => n % 2 === 0)
      );
    }),
    rxjs.operators.switchMap(n => {
      return rxjs.of(n * n);
    }),
    rxjs.operators.scan((acc, cur) => {
      acc.push(cur);
      return acc;
    }, []), 
    rxjs.operators.defaultIfEmpty([])

  );
}

getEvensSquared([1, 2, 3, 4]).subscribe(v => {
  console.log("1,2,3,4");
  console.log(v)
});

getEvensSquared([1, 3, 5]).subscribe(v => {
  console.log("1,3,5"); //works
  console.log(v)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.2/rxjs.umd.min.js"></script>