Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请举例说明RxJS映射和switchMap的区别_Rxjs - Fatal编程技术网

请举例说明RxJS映射和switchMap的区别

请举例说明RxJS映射和switchMap的区别,rxjs,Rxjs,我看过很多关于这个主题的其他帖子,也读过官方(见下文)和半官方的文档,比如,但我仍然无法理解“地图”和“开关地图”之间的区别,我希望通过下面的具体例子来澄清 注:根据RxJS官方文件: 映射:“将给定的项目函数应用于源可观察对象发出的每个值,并将结果值作为可观察对象发出。” switchMap:“将每个源值投影到一个可观测值,该值合并到输出可观测值中,仅从最近投影的可观测值发出值。” 考虑到我的不完全理解,我做了一些非常简单的例子,参见StackBlitz,但仍然不完全理解为什么有些例子会以

我看过很多关于这个主题的其他帖子,也读过官方(见下文)和半官方的文档,比如,但我仍然无法理解“地图”和“开关地图”之间的区别,我希望通过下面的具体例子来澄清

注:根据RxJS官方文件:

  • 映射:“将给定的项目函数应用于源可观察对象发出的每个值,并将结果值作为可观察对象发出。”
  • switchMap:“将每个源值投影到一个可观测值,该值合并到输出可观测值中,仅从最近投影的可观测值发出值。”
考虑到我的不完全理解,我做了一些非常简单的例子,参见StackBlitz,但仍然不完全理解为什么有些例子会以他们的方式产生输出

首先,一些非常简单的
string
示例:

// String Example 1

const source = of('World').pipe(
  map(x => `Hello ${x}!`)
);

source.subscribe(x => console.log(`SOURCE (map): ${x}`));

// SOURCE (map): Hello World!

好吧,很公平,我想我主要明白了

  • “Of”将“世界”排放物作为“管道”的值(或该排放物在现阶段仍然是可观测的吗?)
  • “管道”将“世界”作为“地图”的一个值(或者它仍然是一个可观察的值?)
  • “映射”将此(值?可观察?)投影到“Hello World”,等待所有字符完成,然后将此(值?可观察?)返回到“管道”
  • “管道”然后返回一个可观察的值
  • 因此我们得到了输出:“Hello World”

    哇!打扰一下刚才发生了什么事

  • “Of”将“世界”排放物作为“管道”的值(或该排放物在现阶段仍然是可观测的吗?)
  • “管道”将“世界”作为“开关地图”的一个值提供(或者它仍然是一个可观察的?)
  • “switchMap”将此(值?可观察?)投射到“Hello World”,但与“map”不同的是,“map”在输出到“pipe”一系列可观察(或值?)之前不会等待所有字符完成,每个字符是否有一个可观察?还是每个角色发射一次的可见光
  • “管道”然后返回每个字符上的可观察值 问题:引擎盖下面到底发生了什么,在上面的链条中一步一步地发生了什么

    让我们继续看另一组简单的例子,然后满怀希望地尝试将所有内容联系在一起:

    // OBJECT EXAMPLES
    
    const foo = {
      "first": 1,
      "second": 2
    }
    
    // OBJECT EXAMPLE 1
    
    Object.keys(foo).forEach(obj=>of(foo[obj]).pipe(
      map(x=>x*2)
    ).subscribe(x => console.log(`SOURCE (map): ${x}`)))
    
    // SOURCE (map): 2
    // SOURCE (map): 4
    
    
    好吧,很公平。这似乎很简单

    // OBJECT EXAMPLE 2
    
    Object.keys(foo).forEach(obj=>of(foo[obj]).pipe(
      switchMap(x=>of(x*2))  // WHY DO WE NEED ANOTHER "of()" HERE? "switchMap(x=>x*2)" DOESN'T COMPILE
    ).subscribe(x=> console.log(`SOURCE (switchMap): ${x}`)))
    
    // SOURCE (switchMap): 2
    // SOURCE (switchMap): 4
    
    
    相当清楚,但为什么我们需要向“switchMap”提供“of(x*2)”?在字符串示例2中,“switchMap”似乎疯狂地发出并自动将其输出包装为可观察的(或者“pipe”是否将输出包装为可观察的?),但无论如何,“switchMap”和“pipe”都不需要任何额外的“of()或任何其他帮助将输出包装为可观察的,但在对象示例2中,我们明确需要提供第二个“of()”,以确保“switchMap”的输出是可观察的,否则代码将无法编译。(但对于“map”,我们不需要提供第二个“of()”)。再一次,一步一步,为什么会有不同

    总之,如果有人能解释一下,我将不胜感激:

  • 在上述示例中,我们在链中的哪个点处理数值(即,可观测值的排放量),在哪个点处理可观测值
  • 为什么“switchMap”提供了字符串示例2中的明显解析行为
  • 为什么我们需要在对象示例2中提供“of()”到“switchMap”,而不是在字符串示例2中?(同样,“映射”为什么不需要第二个“of()”?)
  • 提前谢谢你

  • 对于示例运算符,以下是类型转换:

    • of
      :接收类型为
      T
      的参数,生成类型为
      T
      的单个通知,然后完成
    • map
      :接收类型为
      T=>R
      的参数,每当收到类型为
      T
      的通知时,生成类型为
      R
      的通知
    • switchMap
      接收类型为
      T=>observativelike
      的参数,每当收到类型为
      T
      的通知时,都会生成类型为
      R
      的通知

  • 我认为这是主要的困惑
    switchMap
    具有一个投影函数,该函数期望将
    ObservableLike
    作为返回类型。这句话的重要部分是可以观察到的
  • 有时这是违反直觉的,但RxJS在可能的情况下在内部转换其他类型的可观察对象,如:

    • 数组或
    • 允诺
    当在可以提供类似于的可观察性的地方使用数组时,RxJS将数组视为一个值流

    例如,假设我将此数组转换为可观察数组:

    from([1,2,3])

    我得到的是:

    // 1
    // 2
    // 3
    
    由于
    string
    只不过是
    Array
    ,所以RxJS尝试将该字符串转换为它的字符流。(
    char
    在JS中不是真正的数据类型,但字符串内部是一个数组)

    i、 e.这些是平等的:

    • from(['a','b','c'])
    • from('abc')

  • 我想这可以用上面的答案来解释。始终需要为
    开关映射
    提供一个
    可观察类
    ,但是
    字符串
    类型恰好是一个
    可观察类
    ——只是一个字符流

  • 这很有帮助,但仍有以下几个问题:1。官方文件指出,map“将给定的项目函数应用于源可观测值发出的每个值,并将结果值作为可观测值发出。”您指出
    map
    返回类型R。R本身是可观测的(即可观测的),还是R不是可观测的,或者不一定是可观测的?即。,什么是类型
    R
    ?我在
    Typescript泛型R
    上做了一些Web搜索,但没有找到任何结果。是吗
    // 1
    // 2
    // 3