确保 angular 服务逻辑不会为用户 运行 两次

Ensure angular service logic does not run twice for user

我在 Angular 12,TypeScript 4.3.5

中提供服务
//...
@Injectable({
  providedIn: 'root'
})
export class SessionService {
  constructor(
    private lsService: LocalStorageService) {
    }

  getSessionId(): string {
    let userId= this.lsService.get('key');
    if (!userId) {
      userId = this.getRandomId(); // assign new identifier
      this.lsService.set('key', userId);
    }

    return userId;
  }
//...

恐怕会出现这样的情况,userId可能设置了两次,sb会在第二次设置之前读取第一个设置值。

问题:

  1. 这可能吗?
  2. 如何保证这种情况不会发生(没有第 3 方库)?

在 'normal' JS 中(例如没有服务工作者)你只有一个线程。而且你永远不会遇到像这样的问题。使用 Java 或其他 multi-thread 语言。

所以你可以很确定它永远不会发生。

您可以尝试类似的方法,看看方法永远不会冲突:

function test() {
  for (let i = 0; i < 10000; i++) {
    window.testVar++;
  }
  for (let i = 0; i < 10000; i++) {
    window.testVar--;
  }
  console.log(window.testVar);
}

window.testVar = 0;
for (let i = 0; i < 1000; i++) {
  setTimeout(test, Math.random() * 1000)
}

无论你在这里输入什么数字,你都不会看到 non-zero 输出。