Глобальная переменная не работает в подфункции Angular 7

У меня есть вопрос, пожалуйста, объясните мне

import { Component, OnInit,ViewChild,ElementRef  } from '@angular/core';
import {Http,Headers} from "@angular/http";
import { Observable, Subject, asapScheduler, pipe, of, from, interval, merge, fromEvent, Subscription } from 'rxjs';
import { map, filter, debounceTime, tap, switchAll, count } from 'rxjs/operators';
@Component({
  selector: 'app-content',
  templateUrl: './content.component.html',
  styleUrls: ['./content.component.css']
})
export class ContentComponent implements OnInit {
  constructor(private http:Http) {

   }
   @ViewChild('abcde') abcde: ElementRef;
   private typeTerm = new Subject<string>();
   public result:string = "";
}

И переменная вызова функции результат

fTyping(a){
  this.result = "abcd"; //It Working
  if (this.timeout){ clearTimeout(this.timeout);}
  this.timeout = setTimeout(function() {
    this.result = "efgh"; //**Not Working**
    const url = "http://localhost:81/api/films/GetFilms",body=JSON.stringify({username:"admin",password:"admin",page:1,"search":a,sort:this.txtSort});
    const requestHeader = new Headers({ 'Content-Type': 'application/json' });
    http1.post(url,body,{ headers : requestHeader }).toPromise().then(res=>{
    temp=res.json();
    console.info(res.json().length);
    this.isLoading=false;
    if (res.json().length<10){
      this.isData=false;
    }
    else
      this.isData=true;
    }).catch(x=>{
      this.result=JSON.stringify({Name:"No data",Title:"No Data",Manufacture:"No Data",Country:"No Data"});
      this.isLoading=false;
      this.isData=false;
    });
  },500);
}

Problem: Why in function setTimeoutthis.result not woking. Is there any way for it to work in function setTimeout?

Попробуйте использовать функцию стрелки для обратного вызова setTimeout setTimeout(() => {

yurzui 02.02.2019 12:05

Спасибо, ты спас меня! Большое спасибо. Я так благодарен ♥♥

Long Hoàng Nguyễn 02.02.2019 12:13
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
2
580
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

на самом деле setTimeout создает свою собственную эту область в боковой функции, поэтому она не работает, вы можете сохранить ссылку на это в другой переменной

var that=this;
this.timeout = setTimeout(function() {
    that.result = "efgh"; //use that

  },500);

или вы можете использовать функцию стрелки (функция стрелки не создает свою собственную эту область)

setTimeout(() => {
 this.result = "efgh";
},500)

Другие вопросы по теме