Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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 基于承诺的取消间隔会导致角度错误_Javascript_Angular_Typescript_Asynchronous_Promise - Fatal编程技术网

Javascript 基于承诺的取消间隔会导致角度错误

Javascript 基于承诺的取消间隔会导致角度错误,javascript,angular,typescript,asynchronous,promise,Javascript,Angular,Typescript,Asynchronous,Promise,我有这样的业务逻辑,我希望每1秒检查一次服务中的一些数据,如果该数据返回的某些属性为true,我希望取消间隔。例如: someFn() { this.interval = setInterval(this.getData, 1000, param1, param2); } private async getData(param1: string, param2: string) { const data = await this.service.getSomeDat

我有这样的业务逻辑,我希望每1秒检查一次服务中的一些数据,如果该数据返回的某些属性为true,我希望取消间隔。例如:

  someFn() {
    this.interval = setInterval(this.getData, 1000, param1, param2);
  }

  private async getData(param1: string, param2: string) {
    const data = await this.service.getSomeData(param1);
    if (data && receipt.success) {
      console.log('SUCCESS!');
      console.log('Clearing interval', this.interval);
      clearInterval(this.interval);
    }
  }
但是,即使我正在输入if块并输出SUCCESS,间隔也不会停止执行。间隔似乎没有定义。我猜这是因为一些承诺魔法,但我不太明白为什么。感谢您的帮助

编辑:调用
someFn
的按钮如下所示

<button class="btn btn-primary" (click)="myService.someFn()">Do Logic</button>
Do逻辑

Edit2:如果我在
someFn
函数中设置console.log(this.interval),它会记录一个id。但是在getData中,
this.interval
是未定义的。

我已经找到了它。我不是传递对setInterval的引用,而是在回调中执行函数。因此:

 someFn() {
    this.interval = setInterval(this.getData, 1000, param1, param2);
  }
变成

 someFn() {
    this.interval = setInterval(() => this.getData(param1, param2), 1000);
  }

它可以工作。

哪里调用了someFn,如果它被调用了不止一次,您将失去以前的idsomeFn,只需单击一次按钮,它就会执行一些逻辑,然后设置间隔。传递给getData的参数是好的,但是
这个.interval
是未定义的。它是用()=>或按钮处理程序上的FUNCTION调用的吗?您是否可以公开eventListener似乎不起作用。我已经编辑了这个问题again@EugenSunic我通过在setInterval的回调中执行getData解决了这个问题。它可能没有将this.interval值绑定到服务的范围,因为我只传递了对fnOK的引用,但可能不是因为您认为的原因
this.interval=setInterval(this.getData.bind(this),1000,param1,param2)也应该起作用。
bind(this)
是将
this
的含义传达给以其他方式分离的
this.getData()
所必需的。