【问题标题】:Observable Undefined可观察的未定义
【发布时间】:2017-01-30 21:37:09
【问题描述】:

我正在尝试从 observable 中提取值,我的订阅(组件)代码如下:

this.checkoutService.getDisabledDate().subscribe
(dates=>{this.formattedDate=dates}, 
(error:any)=>{console.log(error)});

在“日期”回调中,this.formattedDate 的 console.log 会打印正确的值。但是,尝试在订阅之外访问 this.formattedDate 是未定义的。

服务代码:

getDisabledDate():Observable<any>{
    let headers = new Headers({'Content-Type': 'application/json' });
    let options = new RequestOptions({headers:headers});
    let userRequest={action_id:0};
    let disabledDate={};

    return this.http
        .post(this.deliveryUrl,userRequest,options)
        .map((r:Response)=>r.json())
        .catch(this.handleError);
}

我已经执行了相同的操作,使用短格式 () 通过 queryParam 传递数据,在这种情况下它没有任何区别。我似乎忽略了用这个提取信息所必需的。

我看过两个: Angular2 HTTP using observables subscribe showing data undefinedAngular 2 return data from service is not availabe after RxJs subscribe.

我通过了他们的问题得到回答的地方。我错过了什么?

【问题讨论】:

  • 您是如何尝试访问这些数据的?在你看来?如果是这种情况,您是否像在一个答案中建议的那样使用 *ngIf?
  • 听起来您正试图在数据可用之前对其进行访问。它仅在可观察对象为其返回值之后才可用。您确定 observable 正在返回,即在您尝试访问它之前正在调用 {this.formattedDate=dates 吗?这是我对您问题的最佳猜测。
  • 从技术上讲,这是对如何从异步函数返回值的欺骗。
  • 不幸的是,Jared 的答案太简单了,甚至不能被视为该线程的副本。我只是对我的数据不耐烦了。

标签: angular typescript rxjs


【解决方案1】:

从您的问题中不清楚“外部”在哪里,但如果它是在您收到 Observable 的呼叫之后,那么这是预期的行为

someMethod() {
  this.checkoutService.getDisabledDate()
  .subscribe(
    // anything here is executed sometimes later when the response from the server arrives
    dates=>{ 
      this.formattedDate=dates;
      // code that depends on the result goes here
    }, 
    (error:any)=>{console.log(error)}
  );
  // this is executed first
}

您无法获取subscribe 之外的值。您可以使用map 并将结果返回给调用者订阅,就像在getDisabledDate 中所做的那样,或者您将代码移动到回调之一。

【讨论】:

  • 我理解异步特性意味着以相同方法执行的代码将在 observable 之前完成。我曾认为将订阅移动到构造函数会留出时间让 formattedDate 接收来自 ngOnInit 中的 observable 的值。原来我错了。我将一个 console.log(this.formattedDate) 移到一个按钮上,然后看到它打印了值。
  • @Chris:您希望看到 Angular 2 Route 解析为在控制器中预加载您需要的数据。 Resolves 保证它在控制器加载时为您准备好。请参阅此处:callibrity.com/blog/angular-2-route-resolves 或此处:blog.thoughtram.io/angular/2016/10/10/… 第一篇文章更易于阅读。第二个是架构级开发人员(更深入,更难遵循)。
  • 澄清我对“外部”的含义:访问 .subscribe() 外部的“this.formattedDate”的值; IE。这些值不仅可以在可观察对象本地访问,而且可以在接收变量的范围内访问。
  • 问题更多的是“何时”可用,而不是“在哪里”。 // this is executed first 部分 dates 值可用之前。只有// code that depends on the result goes here之后 dates 可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多