当前位置: 首页 > 知识库问答 >
问题:

可观测需求平面映射()在单()

寿子默
2023-03-14

每次我认为我理解了可观测物,但我不太理解可观测物。所以考虑一下我在Angular 4应用程序中使用的代码:

// this returns the url to our bitbucket server. the uriService returns
// an Observable<string>
return this.uriService.getBitBucketUrl(path)
  
  // I expect exactly one result, no more, no less, otherwise exception        
  .single() 

  // somehow I still need a flatMap here, to supply the url value into the nested observable
  .flatMap((url: string) => {
    
    // we now have the bitbucket url, use it to get json from it.
    return this.httpService.getJson(url)
      
     // map the result and flatten it to an array
     .flatMap((json: HttpResponse<any>): Array<any> => json.body.values)

     // map each value into a more managed model
     .map<any, BitbucketModel>((value: any) => {
        // create and return BitBucketModel here based on json
 })
});

我希望我对代码解释得足够好,所以它的本质是我不想在任何地方使用“订阅”。因为我使用异步管道,所以我希望可以一直观察到。但是,当我使用单(),然后我必须平面映射它,否则它给我一个错误,因为我不能返回可观察

如果我没有把我的问题说清楚,我很抱歉。我的场景是,我基本上需要一个配置设置,我的实际http请求基于该设置。所以我必须检索该设置,并根据该设置执行实际的http请求。

共有1个答案

韩禄
2023-03-14

如果我理解正确的话,你是在问为什么platMap。让我试着解释一下。

map将输入同步转换为输出。所以它把每个项目转换成其他东西,用新项目替换旧项目。这个过程是同步的。

flatMap也会替换,但会异步替换。

flatMap获取一个项目,将其转换为可观测项目,并将新可观测蒸汽的输出置于原始项目的位置。

因此flatMap可用于这两个实例(可能是更多的应用程序):

  1. 如果输出是异步的(例如. url到超文本传输协议调用响应)
  2. 如果输出是可观察的(ex.数组到独立元素)

前任:

...'string1'... 'string2'... => 
 ...Output(Observable created from string1)...
 ...Output(Observable created from string2)...

在您的情况下:

输入:字符串(url)

输出:来自异步http调用的json。

所以,你必须使用flatMap。它与单个代码无关

在您的示例中:

.flatMap((json: HttpResponse<any>): Array<any> => json.body.values)

这是一个同步转换。您正在获取一个对象并同步返回另一个对象。因此,它不必是平面图。你可以说

.map((json: HttpResponse<any>): Array<any> => json.body.values)

事实上,您的代码应该给出一个错误,因为flatMap期望Observable作为返回类型,但您正在返回一个对象。

 类似资料:
  • 我有一个简单的api请求,它向一个对象返回一个可观察的对象,该对象中有一组项,每个项中都有一个链接。因此,我想在当前异步流中直接获取链接后面的数据,但我收到一个CORS错误,错误是: 这是否可能与我当前的函数?还是我误解了一些基本概念?

  • 我需要将一个项目列表映射到可观察的项目中,然后使用另一个函数处理每个可观察的项目flatmap,以将某个REST API调用的结果持久化到数据库中。 API调用将正确返回所有项。但是,FlatMapiteTable不会将所有项目传递给最后一个flatMap。 这是代码。 我不想使用doOnEach或doOnNext,我的问题是关于FlatMapiteTable的行为。 知道为什么我不能到达最后一张

  • 我对webflux比较陌生,我想找到解决方案,在有条件时避免嵌套flatMap: 如何防止这种分支条件平面映射混乱?我无法想象如果我在项目中有另一个实体。会有更多嵌套的平面地图?

  • 我需要在Nativescript中从web服务获取所有警报。但是地图不起作用。我试过这个函数。在Angular 5中工作正常,但在Nativescript中显示此错误: [ts]类型“Observable”上不存在属性“map”。在这方面。映射((响应:响应)= 我导入这个:

  • 我想创建一个可观察的,将按需发射项目,这意味着我想要一个单一的订阅可观察的,并通知可观察的,我需要基于我的请求的新项目。 这就是我使用Publishsubject所做的: } 下面是活动类中的用法: 所以基本上我订阅了Flowable对象,并将Bitmap对象传递给我的Subject类,通过Flowable继续并返回结果,这个解决方案是正确的还是会产生一些内存泄漏? 是否有更好的解决方案将对象发送

  • 我是RxJava的新手,我知道flatmaps用于将发出的项映射到可观察项。我还知道,基于文档,发出的可观测数据都被合并(扁平化)为一个单一的可观测数据流。 我在想,如果这些内在的可观察到的东西都完成了,会发生什么? 例如:我有一个可观察的,它发出一个项数据键。我必须进行另一个异步http调用才能从服务器获取项数据,所以我使用另一个Observable调用它。我使用一个平面地图来连接这两个,并创建