Javascript 角度变量在控制器的某些点返回未定义的值,但在其他点返回其值

Javascript 角度变量在控制器的某些点返回未定义的值,但在其他点返回其值,javascript,angular,angular-controller,Javascript,Angular,Angular Controller,我在一个控制器上工作,在那里我从一个服务中获得一个值数组。当我从服务中获得值时,我将变量的值设置为该数组的第一个元素,然后对该变量执行console.log操作,并正确返回值。当我尝试使用这个值进行一些操作时,问题就出现了,然后当我检查变量时,我得到了未定义的变量,我不明白为什么 这是我的代码: export class DetailTaskComponent implements OnInit { constructor(private taskService: TaskService,

我在一个控制器上工作,在那里我从一个服务中获得一个值数组。当我从服务中获得值时,我将变量的值设置为该数组的第一个元素,然后对该变量执行console.log操作,并正确返回值。当我尝试使用这个值进行一些操作时,问题就出现了,然后当我检查变量时,我得到了未定义的变量,我不明白为什么

这是我的代码:

export class DetailTaskComponent implements OnInit {

  constructor(private taskService: TaskService, private route: ActivatedRoute, private authSservice: AuthService) { }

  // old variable
  taken = false;

  startButton = true;
  pauseButton = true;
  finishButton = true;

  task;
  ////////////////////////////

  // Trabajo con 2 tasks en este componente globalTask y userTask, la primera es la Task en general y la otra es lo que ha hecho el
  // usuario actual con esta Task.

  // Variable que guarda la Task de nivel global
  globalTask: Task;

  // Variable que guarda la Task a nivel del usuario actual
  userTask: UserTask;
  workingTask: UserTask;

  // Variable array de tipo UserTask, hay que usar un array porque aunqeu solo haya un registro
  usersTasks: UserTask[];

  // Esta función recupera la Task a nivel global a partir del parametro :id
  async getTask(id){
    console.log('getTask');
    this.globalTask = await this.taskService.getTask$(id).pipe(first()).toPromise();
  }

  // Si no hay información en el historial del usuario con esa Task creamos una entrada, aunque solo consulte la Task y no interactue
  async setTaskUserHistoric(set: UserTask){

    console.log(`Entro en la funcuión que deberia crear la entraea`);
    set.id = uuidv4();
    set.status = 'Pendent';

    this.workingTask = set;

    await this.taskService.setTaskHistoric(set);

  }

  // Esta función recupera lo que ha hecho el usario ya con la tare actual, si no ha trabajado nunca con ells
  // lo añade a la tabla, para cuando empìece a interactuar con ella no teneer que controlar que infromación hay que crear o guardar
  async getUserTask(update: UserTask){

    console.log('Antes de recuperar el array');

    this.usersTasks = await this.taskService.getHistoric(update).pipe(first()).toPromise();

    console.log(`Total de entradas encontradas: ${this.usersTasks.length}`);

    // Si el usuario ha trabajado alguna vez con la task, ni que sea solo consultarla, tendremos un registro, en caso contrario el array valdrá 0 y
    // habrá que crear una entrada
    if(this.usersTasks.length > 0){
      this.workingTask = this.usersTasks[0]; // Si existre u registro lo guardamos en la vraiable userTask, esta variable es la que guardara todo el progreso del usuario
      console.log('Se ha encontrado una entrada');
      console.log(this.workingTask);
    }
    else {
      this.setTaskUserHistoric(update); // Para crear el registro le paso los datos del usuario y de la task
      console.log(`No se ha encontrado ninguan entrada`);
    }

  }

  // Funciones para manipualr las Tasks
  startTask(){}
  pauseTask(){}
  finishTask(){}

  // Esta función congigura la botonera, por defecto todos los botones estan desactivados y en función del estado de la Task para el usuario
  // se activan o desactivan el boton de play/pause/finish.
  // Esta función no tiene parametros porque usa los variables de userTask;
  setKeypad(task){
    console.log(this.workingTask);
    console.log(task);
    // if(this.userTask.status === 'Pendent'){
    //   console.log(`El usuario nunca ha trabajado con la tarea`);
    // }
  }

  async ngOnInit(): Promise<void> {

    // Al cargar el componente recupero el parametro id de la url y lo paso a la función que recupera la task y la guarda en la globalTask
    await this.getTask(this.route.snapshot.paramMap.get('id'));

    // Ejecuto la función que valida si el usuario ya ha trabajado con la Task y que en cualquier caso informará la variable userTask para poder  guardar el progreso
    // Información mínima para encontrar el historial del usuario
    let check: UserTask = {
      id_task: this.globalTask.id,
      id_user: await this.authSservice.getUser()
    }

    console.log('Antes de revisar si el usario ya tiene una entrada en el user_task');
    this.getUserTask(check);

    // Configuramos la botonera
    this.setKeypad(this.workingTask);

  }

}
导出类DetailTaskComponent实现OnInit{
构造函数(私有taskService:taskService,私有路由:ActivatedRoute,私有authSservice:AuthService){}
//旧变量
take=false;
开始按钮=真;
pauseButton=true;
finishButton=true;
任务
////////////////////////////
//在全球范围内的2项任务和用户任务中,基本任务和一般任务是相互关联的
//通常是实际任务。
//变量que GARDA la Task de nivel global
环球任务;
//变量que GAURDA la Task a nivel del usuario actual
userTask:userTask;
workingTask:UserTask;
//变量数组de tipo UserTask,hay que usar un array porque aunqeu solo haya un registro
usersTasks:UserTask[];
//这是一项新的全球任务,也是一个参数部分:id
异步getTask(id){
log('getTask');
this.globalTask=wait this.taskService.getTask$(id).pipe(first()).toPromise();
}
//没有任何关于乌萨里奥历史的信息,也没有任何互动
异步setTaskUserHistoric(集合:UserTask){
console.log(`Entro en la funcuión que deberia crear la entrea`);
set.id=uuidv4();
set.status='Pendent';
this.workingTask=set;
等待这个.taskService.settaskshistoric(set);
}
//在实际的情况下,我们可以重新开始工作,而不需要重新开始工作
//在塔布拉的一个地方,一个相互影响的公司没有控制权,也没有控制权
异步getUserTask(更新:UserTask){
console.log('Antes de reciperar el array');
this.usersTasks=wait this.taskService.getHistoric(update).pipe(first()).toPromise();
log(`Total de entradas encontradas:${this.usersTasks.length}`);
//这是一项任务,是一个单独的领事馆,在联合国登记处登记在册
//哈布雷·克莱尔·乌纳·恩塔达酒店
如果(this.usersTasks.length>0){
this.workingTask=this.usersTasks[0];//在可编程用户任务中,存在一个变量es la que guardara todo el progreso del usuario
console.log('Se ha encontrado una entrada');
console.log(this.workingTask);
}
否则{
this.settaskUserHistorical(update);//用户和任务数据的注册
log(`No se ha encontrado ninguan entrada`);
}
}
//任务相关职能
startTask(){}
pauseTask(){}
finishTask(){}
//在botonera的congigura公司履行职能时,如果有人叛逃到botones公司,则该公司将失去其在日常工作中的积极性和职能
//停止播放/暂停/完成时,停止活动。
//没有用户任务变量的参数;
设置键盘(任务){
console.log(this.workingTask);
console.log(任务);
//if(this.userTask.status=='Pendent'){
//console.log(`El usuario nunca ha trabajado con la tarea`);
// }
}
异步ngOnInit():承诺{
//cargar公司在全球范围内的任务和保障方面的工作和功能都需要参数
等待这个.getTask(this.route.snapshot.paramMap.get('id');
//通常情况下,有效性功能是一项任务,它包含了一个可变的用户任务,以保证项目的顺利进行
//乌萨里奥历史中心的信息
让我们检查:UserTask={
id_任务:this.globalTask.id,
id\u用户:等待此消息。authSservice.getUser()
}
console.log('Antes de revisar si el-usario ya tiene una entrada en el-user_task');
this.getUserTask(检查);
//波托涅拉酒店
this.setKeypad(this.workingTask);
}
}

Resumin,在onInit上,我调用获取值列表的函数,将第一个元素指定给变量workingTask(此时console.log)返回值,但是当我进入setKeypad()函数时,我无法读取workingTask变量,因为它返回未定义的值。

getUserTask
是一个异步函数,因此,您必须等待其执行才能正确设置
workingTask

await this.getUserTask(check);

// Configuramos la botonera
this.setKeypad(this.workingTask);

getUserTask
是一个异步函数,因此必须等待其执行才能正确设置
workingTask

await this.getUserTask(check);

// Configuramos la botonera
this.setKeypad(this.workingTask);