1

ionic2 のホーム タブでオブザーバブルをキャンセルしようとしていますが、6 時間経っても何も機能していないため、バグである可能性があります。

私が使用している観察可能な例は、このサイトからのものです https://coryrylan.com/blog/intro-to-rxjs-observables-and-angular-2

ngZone を試してみましたが、ngZone から間隔をクリアすることはできません。

私はもう試した

 ionViewWillLeave() {
      this.disposable.dispose();
      clearInterval(this.home_game_timer);

  }

何も機能しません..これがコードです...このコードはホームタブにあります

getGame(){

var link = 'https://gamerholic.com/******';
var data_post = JSON.stringify({game:this.game,uid:this.data.uid,device:this.device_id,session:this.session});
let headers      = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON
let options       = new RequestOptions({ headers: headers }); // Create a request option

return this.http.post(link, data_post, options) // ...using post request
.map(data => data.json())
.catch(this.handleError)
.subscribe((data) =>{
  this.game_data = data

  if(this.game_data.success){
    this.game = this.game_data.games[0].id,
    this.game_data = this.game_data.games[0]
        this.gameStream$ = new Observable(observer=>{
          this.home_game_timer = setInterval(()=>{

              if(this.gone<1){
                var link = 'https://gamerholic.com/****';
                var data = JSON.stringify({game:this.game,uid:this.uid});
                let headers = new Headers({ 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' });
                let options = new RequestOptions({ headers: headers });
                return this.http.post(link, data,options)
                .map(data => data.json())
                .catch(this.handleError)
                .subscribe((data) =>{
                  var d = data
                  observer.next(d)
                })
              }

            },1000)

            return(()=>{
              clearInterval(this.home_game_timer);
            })
        })

        this.disposable = this.gameStream$.subscribe((data)=>{
        this.timer_data = data
        this.list_players = data
        console.log(this.timer_data)
      })

      }
  })

 }
4

2 に答える 2

0

オブザーバブルをキャンセルしたい場合は、それを登録解除する必要があります。あなたがやっていることは、分解ロジックを持つオブザーバブルを作成することです。ここまでは順調ですね。

return(()=>{
          clearInterval(this.home_game_timer);
        })

ただし、ティアダウン ロジックのこのスニペットは、オブザーバブルから明示的にサブスクライブを解除するまで実行されません。したがって、clearInterval を設定しますが、オブザーバブルがサブスクライブ解除されることはないため、このメソッドが呼び出されることはありません。あなたがすべきことは、実際にある時点で購読を解除することです。

this.disposable = this.gameStream$.subscribe((data)=>{
    this.timer_data = data
    this.list_players = data
    console.log(this.timer_data)
  })

this.disposable.unsubscribe(); // ==> this will trigger the teardown logic to be called

これを呼び出すことができる場所は、ニーズによって異なります。いつ呼び出す必要がありますか?コンポーネントの破棄時であれば、destroy ライフサイクル フックを使用できます。

于 2016-10-19T05:21:33.427 に答える