Как изменить переменную внутри обещания в машинописи (область действия и проблема «это»)? - PullRequest
0 голосов
/ 02 января 2019

Я создал проект на Ionic 4.5.0 с использованием машинописи 2.2.1.

В нем у меня есть два класса

file functions.ts
/* lots of import */
@Injectable()
export class Functions {
  language: string;
}

file fooclass.ts
/* lots of import and import of functions.ts */
export class FooClass {
   constructor(public functions: Functions) {
     this.functions.language="ENG";
   }

   somefunction() {
     console.log("1 - language: "+this.functions.language);
     this.someotherfunction().then((response) => {
        console.log("2 - language: "+this.functions.language);
     })
     console.log("3 - language: "+this.functions.language);
   }

someotherfunction() {
  return new Promise((resolve) => {
     this.functions.language="ITA";
     resolve("done");   
  }
}

Это распечатывает

1 - language: ENG
2 - language: ITA
3 - language: ENG

Я подумал, что использование жирной стрелки может связать окружение this, так что внесение изменений в переменную language в this.functions может выдержать обещание некоторой другой функции, но, похоже, это не так. Как я могу изменить переменный язык и сделать так, чтобы изменения остались вне обещания?

РЕДАКТИРОВАТЬ: теперь я понял, что проблема возникла после обновления с предыдущей версии ionic. Может быть, это не должно вести себя так, и это какая-то ошибка? (У меня есть предыдущая версия программного обеспечения, и она работает с тем же кодом)

1 Ответ

0 голосов
/ 02 января 2019

Может быть некоторая проблема с тем, как вы используете functions в конструкторе.Это работает:

class FooClass {
  constructor() {
    this.language="ENG";
  }

  somefunction() {
    console.log("1 - language:" + this.language);
    this.someotherfunction()
    .then((response)=>{
      console.log("2 - language: " + this.language);
    });
    console.log("3 - language: " + this.language);
  }

  someotherfunction() {
    return new Promise((resolve) =>{
      this.language = "ITA";
      resolve("done");   
    });
  }
}

const foo = new FooClass();
foo.somefunction();

При сохранении параметра функций также работает:

class FooClass {
  constructor(functions) {
    this.functions = functions;
  }

  somefunction() {
    console.log("1 - language:" + this.functions.language);
    this.someotherfunction()
    .then((response)=>{
      console.log("2 - language: " + this.functions.language);
    });
    console.log("3 - language: " + this.functions.language);
  }

  someotherfunction() {
    return new Promise((resolve) =>{
      this.functions.language = "ITA";
      resolve("done");   
    });
  }
}

const foo = new FooClass({ language: "ENG"});
foo.somefunction();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...