【问题标题】:Create concatenated observable loop with dynamic length创建具有动态长度的级联可观察循环
【发布时间】:2021-08-03 19:23:37
【问题描述】:

我有一个函数,它根据字符串数组输入给我下一个单词,并附加数组:

getNextWordAndAppend(stringArray: string[]) {
    // parse
    return this.title.getNextWord(word).pipe(
      map((result: {}[]) => {
        const nextWord = // next word from objectArray
        stringArray.push(nextWord ? nextWord.toString() : "")
        return stringArray.filter(item => // some filtering logic)
      })
    )
  }

假设我要链接这个函数,并将前一个 observable 的值传递给下一个,创建一个句子:

initialize() {
    this.formControl.valueChanges.pipe(
        // parse input
        concatMap((stringArray: string[]) => this.getNextWordAndAppend(stringArray)),
        concatMap((stringArray: string[]) => this.getNextWordAndAppend(stringArray)),
        concatMap((stringArray: string[]) => this.getNextWordAndAppend(stringArray)),
        // parse output
    ).subscribe()
  }

假设我想动态确定这个最终 observable 的迭代,我该如何创建如下所示的函数?它需要一个 Observable 作为输入,也应该返回一个。

伪代码:

    //
    .pipe(
        // Initial value, Observable to loop, and number of iterations 
        concatAndPassResult(["Hello", "world"], this.getNextWordAndAppend, 50)
    )

concatAndPassResult 会是什么样子? reduce 的东西?

【问题讨论】:

  • 所以初始值只追加在.第一次循环?
  • 不,第一个函数将接受一个字符串数组,添加一个单词,然后将新数组传递给下一个函数,该函数会将一个单词附加到字符串数组,将其传递给下一个函数等
  • 但是从代码中看起来你的 initialValue 来自表单值?
  • 正确,第一个用户输入是一个字符串数组,我将它传递给一个可观察对象,这给了我一个新的字符串数组,我需要将它传递给同一个可观察对象,这给了我一个新的字符串数组,我需要将其传递给同一个可观察对象等

标签: javascript loops rxjs refactoring


【解决方案1】:

您可以使用expand 递归运行异步可观察对象并附加结果。 take 可以完成流指定的执行次数。

因为初始值来自可观察的来源,所以我稍微更改了您的函数签名。

getWords 这里是模拟异步调用,返回随机字

import { from, of, timer } from "rxjs";
import { map, takeWhile, take, tap, expand } from "rxjs/operators";

const getWords = timer(1000).pipe(map(() => "someword" + Math.random()));
const concatAndPassResult = (stream, count) => (source) => {
  return source.pipe(
    expand((value) => stream.pipe(map((v) => [...value, v]))),
    take(count)
  );
};

of(["Hello", "world"])
  .pipe(concatAndPassResult(getWords, 40))
  .subscribe(console.log);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2018-01-29
    • 2019-05-22
    • 2020-11-23
    • 2017-08-25
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多