subscribe函数导致循环

时间:2018-05-23 08:02:36

标签: javascript angular typescript ionic3

我尝试使用cryptocompar中的API来获取数据。

更新了更多详细信息,并从代码中删除了ngClass。 在test.ts

   // data from library page
   coinsGroup = [];

 datainfo: Observable<any>;


  coins:any;

  constructor(public navCtrl: NavController, public navParams: NavParams, public http: HttpClient) 
{
  }


  ionViewDidLoad() 
{

console.log('ionViewDidLoad TestPage');
    this.coinsGroup = this.navParams.data;
  }

 getdetail(coin) {

    this.datainfo = this.http.get("https://min-api.cryptocompare.com/data/pricemultifull?fsyms="+coin+"&tsyms=USD");
    this.datainfo.map(res => res)
    .subscribe(data => {
      this.coins = data['DISPLAY'][coin]['USD']['PRICE']
      console.log('my data: ', this.coins);
    });
  }

on test.html

 <span *ngIf="coinsGroup.symbol"  class="bold1">

 {{getDetail(coinsGroup.symbol)}}</span>  

的 coinsGroup将从图书馆页面中获取符号,例如[&#39; BTC&#39;,&#39; ETH&#39;,...等]

在chrome上的控制台上,它会保持循环,如下所示,直到浏览器崩溃。

enter image description here

当使用subscribe()和map时会导致无限循环,如上所示,不确定原因,以及如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

是。

<span [ngClass]="getdetail('BTC')" class="bold1">{{ coins }}</span>

是问题所在。 ngClass尝试为string设置class值。 (所以你可以申请css)。这不是你想要做的,你试图检索所有硬币,然后显示它们。

这样做的方法是这样的:

datainfo: Observable<any>;  
coins:any;

constructor(public navCtrl: NavController, public navParams: NavParams, public http: HttpClient) 
{}
// load the coins after the view is loaded, can also be done on ngOnInit
ionViewDidLoad(){   
    this.getDetail('BTC'); 
}

getdetail(coin) {
    this.datainfo = this.http.get("https://min-api.cryptocompare.com/data/pricemultifull?fsyms="+coin+"&tsyms=USD");
    this.datainfo
      .map(res=>res)
      .subscribe(data => {
        this.coins = data
        console.log('my data: ', this.coins);
    });
}

只需设置

即可
<ion-content padding>

  <div style="text-align: center;">
    <!-- the ngIf directive will only show this span if `coins` is defined -->    
    <span *ngIf="coins" class="bold1">{{ coins }}</span> 

</div> 
</ion-content>

如果您想创造更多硬币,最佳做法可能如下:

  let coinList = ["BTC", "ETH", "LTE"];

  constructor(/* ... */) {}


  getDetail(coin): Observable<any> {
    // don't subscribe, return Observable
    this.http.get("...").map(res=>res);
  }

在你的HTML中

<ion-content padding>

  <div style="text-align: center;">

    <span *ngFor="let coin of coinList" class="bold1">
       {{ getDetail(coin) | async }}
    </span> 
</div> 
</ion-content>

答案 1 :(得分:1)

您的观点应该是被动的,它应该只显示结果。在这里,您在视图显示中调用一个更改数据的函数,这可能会改变视图,从而更改数据...等等......

答案 2 :(得分:0)

我删除了如上所示的ngClass,但仍然在循环。

  

//来自库页面的数据coinsGroup = [];

     

datainfo:Observable;

     

硬币:任何;

     

构造函数(public navCtrl:NavController,public navParams:   NavParams,公共http:HttpClient){}

     

ionViewDidLoad(){

     

console.log('ionViewDidLoad TestPage');       this.coinsGroup = this.navParams.data; }

     

getdetail(硬币){

this.datainfo = this.http.get("https://min-api.cryptocompare.com/data/pricemultifull?fsyms="+coin+"&tsyms=USD");
this.datainfo.map(res => res)
.subscribe(data => {
  this.coins = data['DISPLAY'][coin]['USD']['PRICE']
  console.log('my data: ', this.coins);
});   }

on test.html

* ngIf =“coinsGroup.symbol”class =“bold1”&gt;

{{getDetail(coinsGroup.symbol)}}

enter image description here