如何在 Angular 2 轮询服务中访问 .subscribe 之外的值

Posted

技术标签:

【中文标题】如何在 Angular 2 轮询服务中访问 .subscribe 之外的值【英文标题】:How to access value outside the .subscribe in angular 2 polling service 【发布时间】:2018-06-22 08:55:24 【问题描述】:

// 我试图从订阅外部获取值,但它不能分配给任何变量。在我的项目中,使用 http.post() 方法获取 json 内容并将其分配给一个变量。我想在构造函数之外访问这些变量值。我怎样才能使它成为可能?

ngOnInit(): void 
    this.getSubscription();


// here is my subscription function

getSubscription() 
    interval(5000)
        .pipe(
         startWith(0),
         switchMap(() => this._subscriptionService.getSubData()))
         .subscribe(data => 
             this.Result = data; // able to print the data
             JSON.stringify(this.Result);

             console.log(this.Result); // able to print the data
         );

    console.log(this.Result); // undefined is printing                

//我想在订阅之外访问this.result并赋值给一个公共变量

【问题讨论】:

【参考方案1】:

您在ngOnInit 中调用getSubscription(),此时您的变量Result 未设置,因为您的http 请求是异步的。在您的订阅方法第一次执行后,变量被设置。

如果其他函数需要该值,我建议您在订阅中调用它们,否则您无法确定您的 http 请求何时完成。

getSubscription() 
    interval(5000)
        .pipe(
         startWith(0),
         switchMap(() => this._subscriptionService.getSubData()))
         .subscribe(data => 
             this.Result = data; // able to print the data
             JSON.stringify(this.Result);

             console.log(this.Result); // able to print the data

             // Is called every time you get a new result and this.Result is set now
             this.processResults();
     );

    // Not set yet
    console.log(this.Result); // undefined is printing                


processResults() 
    // Do some stuff with your results, this.Result is set now

【讨论】:

我已经在函数之外定义了 Result 变量,它不会像那样工作。你能举个例子吗??【参考方案2】:

在函数外定义结果,如下所示

Result:any;

ngOnInit(): void 
       this.getSubscription();
    

// here is my subscription function

     getSubscription() 
        interval(5000)
        .pipe(
         startWith(0),
         switchMap(() => this._subscriptionService.getSubData()))
         .subscribe(data => 
          this.Result = data; // able to print the data
          JSON.stringify(this.Result);

          console.log(this.Result); // able to print the data
                     );

           console.log(this.Result); // undefined is printing                
          

【讨论】:

我已经在函数之外定义了 Result 变量,它不会像那样工作。你能举个例子吗??【参考方案3】:

这是因为 console.log(this.Result).subscribe() 方法完成执行之前执行。这可以通过使用 async await 来处理。

async ngOnInit(): void 
 await this.getSubscription();

【讨论】:

订阅是不可等待的,只是承诺。

以上是关于如何在 Angular 2 轮询服务中访问 .subscribe 之外的值的主要内容,如果未能解决你的问题,请参考以下文章

来自ngOnInit中的服务的Angular 4轮询/流数据

在 Angular 8 中,如何从浏览器控制台访问注入的服务?

apache_conf Angular 2中的HTTP轮询

Angular 2从服务访问组件变量,即绑定到另一个服务,该服务绑定到组件

在 Jest 测试框架中访问 Angular 服务构造函数

这种轮询可以接受吗(来自 Laravel 的 Angular 轮询数据)?