javascript 如何使用angular15使方法通用并从共享服务文件调用到服务

sqserrrh  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(121)

bounty还有5天到期。回答此问题可获得+50声望奖励。Bhrungarajni正在寻找规范答案

我使用的是angular15,这里我需要生成唯一的id,所以当我在相应的服务文件中添加一组代码时,这个过程运行得很好,但是由于这组代码在所有服务分支中使用,我在共享服务下创建了一个方法,并试图获取该数据,但我得到的是未定义的。
shared.service.ts:

public generateUniqueId() {
        return uuid();
       }
    
       generateCorrelationId(routerEvent:any,route:string):any {
        let previousUrl:any =[];
        let uniqueCorrelationId = '';
        routerEvent.events
        .pipe(filter(event => event instanceof NavigationEnd))
        .subscribe(({urlAfterRedirects}: NavigationEnd) => {
          previousUrl.splice(0,previousUrl.length-1)
          previousUrl = [...previousUrl, urlAfterRedirects];
          if(previousUrl.length === 1 && previousUrl[0]=== route) {
            return uniqueCorrelationId = this.generateUniqueId();
          } else if(previousUrl.length == 2 && previousUrl[1] === previousUrl[0]) {
            return uniqueCorrelationId
          } else if(previousUrl.length == 2 && previousUrl[1] != previousUrl[0]) {
            return uniqueCorrelationId = this.generateUniqueId();
          } else {
            return uniqueCorrelationId;
          }
        });
      }

component.service.ts:

constructor(private geneateUUid:GenerateUniqueIdService) {
      let uniqueIdGeneration = this.geneateUUid.generateCorrelationId(this.router,'/findprofile');
      console.log(uniqueIdGeneration,"uniqueIdGeneration")
    }

观察结果:在控制台中,第一个组件控制台值出现,共享服务下的下一个相应控制台出现。同样在这里,基于特定的组件服务命中,我正在检查新密钥的生成或保留它,是否可以动态地这样做,我的意思是作为一个共同的检查,以前和当前的路由是否匹配。

lb3vh1jj

lb3vh1jj1#

就我个人而言,我会使用await来使代码更具可读性。
试试这个:

async generateCorrelationId(routerEvent:any,route:string): Promise<string> {
  let previousUrl:any =[];
  let uniqueCorrelationId = '';

  const navigationEnd: NavigationEnd = await new Promise((resolve) => {
    routerEvent.events.pipe(
      filter(event => event instanceof NavigationEnd),
      first() // wait for the first NavigationEnd event
    ).subscribe(resolve);
  });

  previousUrl.splice(0, previousUrl.length - 1);
  previousUrl = [...previousUrl, navigationEnd.urlAfterRedirects];

  if (previousUrl.length === 1 && previousUrl[0] === route) {
    uniqueCorrelationId = this.generateUniqueId();
  } else if (previousUrl.length == 2 && previousUrl[1] === previousUrl[0]) {
    // Do nothing, return empty string
  } else if (previousUrl.length == 2 && previousUrl[1] != previousUrl[0]) {
    uniqueCorrelationId = this.generateUniqueId();
  }

  return uniqueCorrelationId;
}

在转换后的代码中,generateCorrelationId函数返回解析为唯一相关ID的Promise。该函数使用first()运算符等待第一个NavigationEnd事件,然后使用resolved事件获取urlAfterRedirects属性。
previousUrl数组的splice和push方法被替换为使用spread运算符的赋值。最后,该函数返回基于当前和以前的URL生成的唯一相关ID。

相关问题