【问题标题】:subscribe function causes loop订阅函数导致循环
【发布时间】:2018-11-02 02:59:40
【问题描述】:

我正在尝试使用 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);
    });
  }

在 test.html 上

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

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

coinGroup 将从库页面获取符号,例如 ['BTC','ETH',..etc]

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

当使用 subscribe() 和 map 时,会导致如上所示的无限循环,不知道为什么,以及如何解决这个问题?

【问题讨论】:

  • 为什么在ngClass 中调用该函数?它应该在那里设置什么?
  • 为什么要调用ngClass中的函数,有必要吗?它也不返回任何布尔值
  • 我想在 html 中调用 getdetail() 函数,来获取 html 上的美元价格、高点、低点等数据。

标签: javascript angular typescript ionic3


【解决方案1】:

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

【讨论】:

  • 这样我就开始循环了,谢谢。
【解决方案2】:

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

//来自图书馆页面的数据coinGroup = [];

数据信息:可观察的;

硬币:任何;

构造函数(公共 navCtrl:NavController,公共 navParams: 导航参数,公共 http: HttpClient) { }

ionViewDidLoad() {

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

获取详细信息(硬币){

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);
});   }

在 test.html 上

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

{{getDetail(coinsGroup.symbol)}}

【讨论】:

    【解决方案3】:

    是的。

    &lt;span [ngClass]="getdetail('BTC')" class="bold1"&gt;{{ coins }}&lt;/span&gt;

    是问题所在。 ngClass 尝试为 class 设置 string 值。 (所以你可以应用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>
    

    【讨论】:

    • 它正在测试页面上工作,但是当我应用到实际项目时它正在循环。我将重构代码,看看它为什么不起作用。
    • 仔细检查旧文件没有被缓存,看起来你正在使用 chrome 所以打开 chrome devtools (mac) cmd+opt+i / Network Tab / 在顶部你会发现一个禁用缓存复选框。
    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2018-09-30
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多