首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在rxjs 6和RXJ6中使用flatMap输入问题

在rxjs 6和RXJ6中使用flatMap输入问题
EN

Stack Overflow用户
提问于 2019-09-29 19:36:10
回答 2查看 456关注 0票数 0

我正在学习角的rxjs。我从教程中下载了项目,有一个类无法编译。我试图纠正它,假设一些库已经发展,但我失败了。我将代码简化到最低限度,我仍然不明白为什么会出现错误。这是通过Intellij提供的类型记录错误。

下面第7行出现了一个错误:

代码语言:javascript
运行
复制
import { flatMap, map } from 'rxjs/operators';
import { Observable, of } from 'rxjs';

export class TestClass {
    a$ = of('dummy').pipe( // Observable<string>
        flatMap(s => of(s)), // Observable<string>
        map<string, string>(s => s) // Observable<string>  <-- ERROR HERE
    );

    b$ = of('dummy').pipe( // Observable<string>
        flatMap(s => of(s)), // Observable<string> or Observable<Observable<string>> ?
        map<Observable<string>, Observable<string>>(os => os)
    );
}

map()只是想看看在flatMap()之后需要什么样的类型。

就我所理解的flatMap而言,条目上有一个Observable<T>,您可以将每个条目T映射到一个Observable<T>,而flatMap则将整个条目平放回一个Observable<T>

但是在$中有一个错误。

而b$则编译得很好。看起来,flatMap并没有使内容扁平化并产生一个Observable<Observable<T>>。下一个map()期望Observable<T>作为项。

那是怎么回事?在flatMap()pipe()中有什么我不明白的吗?还是我的编译器或IDE发生了什么有趣的事情,而我却收到了错误的错误消息?

更新

最后,这是一个问题,打字稿给出一个假错误。我恢复了对函数式编程理解的信心。

EN

回答 2

Stack Overflow用户

发布于 2019-09-29 20:15:02

of('dummy')创建了一个可观察的'dummy',并将字符串'dummy'从管道中释放出来。

flatMap (根据docs 这里mergeMap的别名),将接收前面的操作符/静态方法发送到管道中的内容,将其映射到投影仪函数上指定的任何内容,然后将其压平,合并到外部可观察的位置(如docs 这里)。

在使用flatMap(s => of(s))的情况下,字符串'dummy'将映射到可观测的,并且在返回并向下发送管道之前,flatMap将将其合并到外部可观测的位置,因此您没有Observable<Observable<string>>和简单的Observable<string>

RxJs操作符被期望接收可观测值并返回管道下的可观测值(如果其中之一,如map,不显式返回可观测的,则RxJ会在窗帘后面为您执行此操作)。因此,您的最后一个map将收到一个Observable<string>,就像在b$中所期望的那样,而不是像在a$中预期的那样,一个普通的string

票数 0
EN

Stack Overflow用户

发布于 2019-09-30 21:31:41

我解决了我的问题。

我对flatMap的理解是正确的,而tslint在这个问题上是错误的。

在升级了类型记录和tslint的版本(和其他几个版本)之后,a$编译了OK和b$,就像我预期的那样,会产生一个错误。

我使用的tslint版本似乎存在一些问题,或者可能是与其他库的兼容性问题,从而导致错误。

为了记录在案,没有工作的配置包括:

代码语言:javascript
运行
复制
"@angular-devkit/build-angular": "~0.6.8",
"@angular/...": "^6.0.3",
"rxjs": "^6.0.0",
"ts-node": "~5.0.1",
"typescript": "~2.7.2",
"tslint": "~5.9.1"

工作的配置包括:

代码语言:javascript
运行
复制
"@angular-devkit/build-angular": "^0.13.0",
"@angular/...": "^6.1.3",
"rxjs": "6.0.0",
"ts-node": "~7.0.1",
"typescript": "~2.7.0"
"tslint": "~5.11.0",
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58158550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档