【问题标题】:How to return a value with observable when it becomes defined?如何在定义时返回一个可观察的值?
【发布时间】:2018-04-11 20:00:57
【问题描述】:

我想知道是否有办法将 observable 包裹在 sessionStorage.getItem('currentuser') 周围,以便调用代码只有在 sessionStorage 中设置后才能订阅并获取该值

这可能吗?

阿南德

【问题讨论】:

  • 你为什么要在自己的问题中感谢自己?
  • 哈哈哈 - 这是一个很好的@Zachscs
  • 但是说真的 sessionStorage 是同步的。试试 localForage。

标签: angular rxjs5


【解决方案1】:

当然可以。您可以使用 Service 以这种方式解决它

import {Subject} from 'rxjs/Subject';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class StorageService {

    private storageAlert: Subject<any> = new Subject('');
    private propagationIsBlocked: false;

    // use this blocker for option 3
    blockPropagation(): void {
        propagationIsBlocked = true;
    }

    // use this unblocker for option 3
    unblockPropagation(): void {
        propagationIsBlocked = false;
    }

    // subscribe to this method in order to get updated whenever a change happens
    getValue(): Observable<any> {
        return this.storageAlert.asObservable();
    }

    // trigger the update << option1
    setValue(value: any) {
        if(value){
            this.sessionStorage.setItem('key', 'value');
            this.storageAlert.next(value);
       } 
    }

    // trigger the update << option2
    setValue(value: any) {
        if(value && value.id !== storageAlert.getValue().id){
            this.sessionStorage.setItem('key', 'value');
            this.storageAlert.next(value);
       }
    }

    // trigger the update << option3
    setValue(value: any) {
        if(!this.propagationIsBlocked){
            this.sessionStorage.setItem('key', 'value');
            this.storageAlert.next(value);
        }
    }
}

但老实说,如果您使用此服务,则不需要 sessionStorage 或 localStorage,因为该值已存储在服务的变量“storageAlert”中。并且每个订阅实例由于订阅而获得新值。

【讨论】:

  • 嗨@DiabolicWords,感谢您的回复。我喜欢关于使用服务存储而不是 sessionStorage 的提示。但是,我还需要一种方法来对 subscribe 进行阻塞调用,以便调用代码在值可用之前不会继续执行。这可能吗?
  • 嗨,阿南德。据我所知,您只能订阅或取消订阅 Observable。没有预见到“不提供”状态。但是您可以通过在 setter 中实现一个简单的 if 子句来实现这一点。我重新编辑了我的代码并建议了 3 种不同的方法来实现您的目标。也许其中之一就是您所期望的。
  • 嗨 DiabolicWords - 非常感谢您的说明。我希望我能够利用这些。但是我必须在应用程序引导时执行此操作,因此在该流程中的某个地方我确实需要阻止,因此我仍然需要依赖 sessionStorage
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2021-10-31
  • 2017-04-19
  • 2019-11-20
  • 2022-10-15
  • 1970-01-01
相关资源
最近更新 更多