Rx Subscribe OnComplete 触发但无法使用数据

Posted

技术标签:

【中文标题】Rx Subscribe OnComplete 触发但无法使用数据【英文标题】:Rx Subscribe OnComplete fires but cannot use the data 【发布时间】:2017-01-06 18:39:33 【问题描述】:

我有一个产品服务,其方法可以从 json 数据返回 Observable。

product.service.ts....

getProducts(): Observable<IProductData[]> 
    return this._http.get(this._productUrl)
        .map((response: Response) => <IProductData[]> response.json())
        .catch(this.handleError);

在我的组件中,我订阅服务并调用 getProducts() 方法返回 Observable IProductData[]。

mycomponent.ts ..

productData: IProductData[];

ngOnInit(): void 

    this._productService.getProductsObservable()
        .subscribe(
                productData => this.productData = <IProductData[]>productData,
                error =>  this.errorMessage = <any>error,
                function()  console.log(this.productData ) 
        );

当我查看 onCompleted console.log this.productData 未定义!

我想使用这些数据来设置组件中的字段。何时/如何确定数据已返回?

如果我在按钮单击事件上输出 this.productData,则数据已被填充,但我想在初始化时执行此操作。

任何建议或意见将不胜感激。

干杯

【问题讨论】:

【参考方案1】:

您没有在最后一个块中使用箭头函数,因此您的 this 是您传入的 complete 函数的本地函数。

除了外观之外,() =&gt; function() 之间存在实际语义差异

在这里阅读:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Functions/Arrow_functions

...直到箭头函数,每个新函数都定义了自己的 this 值(在构造函数的情况下是一个新对象,在严格模式函数调用中未定义,如果函数被称为“对象方法”,则为上下文对象,等等。)。事实证明,这种面向对象的编程风格很烦人。

在 ECMAScript 3/5 中,通过将 this 中的值分配给可以关闭的变量来解决此问题。

箭头函数不会创建自己的 this 上下文;相反,它捕获了封闭上下文的 this 值...

【讨论】:

谢谢保罗!我现在对箭头函数在 JavaScript 中的工作方式有了更清晰的了解:)

以上是关于Rx Subscribe OnComplete 触发但无法使用数据的主要内容,如果未能解决你的问题,请参考以下文章

在订阅上最终可观察到

rx汇总总结

EventHandler 与 Rx 主题

Rx 操作符六

处理 RX 中的 response.body == null

当我尝试编辑文本时,searchBar.rx.textDidBeginEditing 不起作用