确保 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会在第二次设置之前读取第一个设置值。
问题:
- 这可能吗?
- 如何保证这种情况不会发生(没有第 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 输出。
我在 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会在第二次设置之前读取第一个设置值。
问题:
- 这可能吗?
- 如何保证这种情况不会发生(没有第 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 输出。