上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

Rxjs关于concatMap stack overflow堆栈溢出问题

[复制链接]
  • TA的每日心情
    开心
    昨天 23:59
  • 签到天数: 170 天

    [LV.7]常住居民III

    470

    主题

    4281

    帖子

    4322

    积分

    管理员

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    4322

    喜迎中秋国庆纪念章荣誉开发者管理员油中2周年

    发表于 2023-1-21 06:52:08 | 显示全部楼层 | 阅读模式

    具体可以参考
    https://bbs.tampermonkey.net.cn/thread-4027-1-1.html
    存在一个

                  while (buffer.length && active < concurrent) {
                    const bufferedValue = buffer.shift()!;
                    // Particularly for `expand`, we need to check to see if a scheduler was provided
                    // for when we want to start our inner subscription. Otherwise, we just start
                    // are next inner subscription.
                    if (innerSubScheduler) {
                      executeSchedule(subscriber, innerSubScheduler, () => doInnerSub(bufferedValue));
                    } else {
                      doInnerSub(bufferedValue);
                    }
                  }

    这里会循环调用doInnerSub(bufferedValue);来继续调用
    如果buffer存在的观察者过多容易导致堆栈溢出问题
    关于这个可以参考
    https://github.com/ReactiveX/rxjs/issues/4055
    https://github.com/ReactiveX/rxjs/issues/3609
    https://github.com/ReactiveX/rxjs/pull/3621
    需要使用queueScheduler
    因为uQueueScheduler将递归循环变成了迭代循环

      public flush(action: AsyncAction<any>): void {
        const { actions } = this;
    
        if (this._active) {
          actions.push(action);
          return;
        }
    
        let error: any;
        this._active = true;
    
        do {
          if ((error = action.execute(action.state, action.delay))) {
            break;
          }
        } while ((action = actions.shift()!)); // exhaust the scheduler queue
    
        this._active = false;
    
        if (error) {
          while ((action = actions.shift()!)) {
            action.unsubscribe();
          }
          throw error;
        }
      }

    实现原理类似于https://bbs.tampermonkey.net.cn/thread-4026-1-1.html
    所以如果可观测到存在大量的堆积问题请尝试使用调度器
    官方宣称这是一种广度搜索和深度搜索的差异问题
    但是我个人来说还是不喜欢的...

    结语

    撒花~

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    无聊
    2 小时前
  • 签到天数: 82 天

    [LV.6]常住居民II

    72

    主题

    386

    帖子

    541

    积分

    荣誉开发者

    Rank: 10Rank: 10Rank: 10

    积分
    541

    荣誉开发者国庆纪念章油中2周年

    发表于 2023-1-21 08:51:02 | 显示全部楼层
    卷死了!!!!!
    I frequently record, because want to leave something.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 23:59
  • 签到天数: 170 天

    [LV.7]常住居民III

    470

    主题

    4281

    帖子

    4322

    积分

    管理员

    非物质文化遗产社会摇传承人

    Rank: 10Rank: 10Rank: 10

    积分
    4322

    喜迎中秋国庆纪念章荣誉开发者管理员油中2周年

    发表于 2023-1-21 11:28:17 | 显示全部楼层
    wwwwwllllk 发表于 2023-1-21 08:51
    卷死了!!!!!

    这代码你冲不冲!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表