Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用计时器时,Angular看不到变量值_Javascript_Angular_Typescript_Angular9 - Fatal编程技术网

Javascript 使用计时器时,Angular看不到变量值

Javascript 使用计时器时,Angular看不到变量值,javascript,angular,typescript,angular9,Javascript,Angular,Typescript,Angular9,我需要根据计时器调用angular组件中的后端函数。 我尝试了两种选择: 备选方案N1: _api: Service; constructor(api: Service){ this._api = api; if (this.timeout != null) { clearTimeout(this.timeout); } this.timeout = setTimeout(() => { this.update();

我需要根据计时器调用angular组件中的后端函数。 我尝试了两种选择:

备选方案N1:

_api: Service;

constructor(api: Service){
 this._api = api;
    if (this.timeout != null) {
      clearTimeout(this.timeout);
    }

    this.timeout = setTimeout(() => {   
        this.update();      
    }, 20000);
}

update()
{
this._api.GetData()….
}
此实现的结果不是每N秒运行一次计时器,它只调用一次update()函数。但通过这种方法,我可以访问this.api的方法/属性

备选方案N2:

_api: Service;

constructor(api: Service){
 this._api = api;
 setInterval(this.update, 2000);
}

update()
{
this._api.GetData()….
}
结果是:出于某种原因,它无法看到此api的方法/属性。 我检查了如果不使用setInterval是否可以看到它们,似乎问题是由setInterval引起的


请建议如何在Angular中安排某些方法的计时器工作?

您使用
setInterval
每n秒运行一次区块是正确的,但您需要使用箭头函数表示法,使用
关键字引用类成员变量。试试下面的方法

构造函数(api:服务){
这个._api=api;
setInterval(()=>{this.update()},2000);//{this.update()},2000);
}
更新(){
此.api.GetData()文件…。
}
此外,我假定您正在
GetData()
函数中发出一些HTTP请求。在这种情况下,最好在触发间隔中的新请求之前取消任何即将发生的请求

dataSubscription: any;

constructor(api: Service) {
  setInterval(() => { this.update() }, 2000);
}

update() {
  if (this.dataSubscription) {
    this.dataSubscription.unsubscribe();    // <-- unsubscribing cancels any impending requests
  }
  this.dataSubscription = this.api.GetData()….
}

dataSubscription:any;
构造函数(api:服务){
setInterval(()=>{this.update()},2000);
}
更新(){
if(this.dataSubscription){

this.dataSubscription.unsubscribe();//您使用
setInterval
每n秒运行一次区块是正确的,但是您需要使用箭头函数表示法,使用
this
关键字引用类成员变量。请尝试以下操作

构造函数(api:服务){
这个._api=api;
setInterval(()=>{this.update()},2000);//{this.update()},2000);
}
更新(){
此.api.GetData()文件…。
}
此外,我假设您正在
GetData()
函数中发出一些HTTP请求。在这种情况下,最好在触发间隔内的新请求之前取消任何即将发生的请求

dataSubscription: any;

constructor(api: Service) {
  setInterval(() => { this.update() }, 2000);
}

update() {
  if (this.dataSubscription) {
    this.dataSubscription.unsubscribe();    // <-- unsubscribing cancels any impending requests
  }
  this.dataSubscription = this.api.GetData()….
}

dataSubscription:any;
构造函数(api:服务){
setInterval(()=>{this.update()},2000);
}
更新(){
if(this.dataSubscription){
this.dataSubscription.unsubscribe();//


班级服务{
getData(){
返回rxjs.of(数组(Math.floor(Math.random()*5)).fill(0).map((pr,index)=>({id:index})))
}
}
类组件{
建造师(服务){
服务=服务;
这个。可观察=空;
this.ngOnInit=this.ngOnInit.bind(this);
}
恩戈尼尼特(){
this.observable=rxjs.间隔(3000)
.pipe(rxjs.operators.mergeMap(=>this.service.getData());
}
}
const service=新服务();
常量组件=新组件(服务);
组件。ngOnInit();
component.observable.subscribe(值=>{
console.log(值)
})


班级服务{
getData(){
返回rxjs.of(数组(Math.floor(Math.random()*5)).fill(0).map((pr,index)=>({id:index})))
}
}
类组件{
建造师(服务){
服务=服务;
这个。可观察=空;
this.ngOnInit=this.ngOnInit.bind(this);
}
恩戈尼尼特(){
this.observable=rxjs.间隔(3000)
.pipe(rxjs.operators.mergeMap(=>this.service.getData());
}
}
const service=新服务();
常量组件=新组件(服务);
组件。ngOnInit();
component.observable.subscribe(值=>{
console.log(值)
})