Как вернуть значение в then () - PullRequest
0 голосов
/ 07 ноября 2018

Я знаю, что подобные вопросы задавались. Но я объясню разницу.

У меня есть функция с именем login(), которая должна возвращать пользователя. Эта функция вызывает другую функцию, которая вызывает мой бэкэнд. Функция login() должна дождаться завершения обещания, прежде чем вернуть пользователя. Проблема в том, что если я вставлю возврат в then(), он скажет:

[ts] Функция, объявленный тип которой не является ни void, ни any вернуть значение.

Его нужно вернуть, потому что вызывающей его функции потребуется JWT пользователя.


Упрощенный код:

login(user: User): User {
  this.user = user;
  //in between I fill some fields for the user
  this.loginPromise().then(user => {
    return user;
  })
  .catch(err => {
    console.log(err);
    //it doesn't make a difference wether I return a user here or not
}

loginPromise(): Promise<{}> {
 var promise = new Promise(function(resolve, reject) {
  this.restProvider.login(this.user)
  .subscribe(result => {
    const jwt = result.headers.get('JWT');
    const config = { ... result.body };
    if(config['result'] != 'failed'){
      this.user.$JsonWebToken = jwt;
      this.user.$passwordIsValid = true;
      this.user.$usernameIsValid = true;
      resolve(this.user);
    }
  }, err => {
    console.log("error: " + err);
    reject(err);
  });
 })
 return promise;
}

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Функция login не может возвращать User объект напрямую, она должна возвращать Promise<User> объект, поскольку она получает user объект асинхронно.

login(user: User): Promise<User> {
  this.user = user;
  //in between I fill some fields for the user
  return this.loginPromise()
  .catch(err => {
    console.log(err);
  });
}

И тогда потребительская функция вызовет функцию login и с помощью .then получит значение user, полученное с сервера.

this.login().then(
  user => console.log(user);
)
0 голосов
/ 07 ноября 2018

вы не можете вернуться с .then, здесь вы можете использовать опцию async await, но в этом случае ваша login функция вернет promise, поэтому вам нужно будет вызвать .then при входе в систему при вызове login функция

async login(user: User): Promise<User> {
  this.user = user;

  return await this.loginPromise();
}
0 голосов
/ 07 ноября 2018

Если вы перейдете из этого loginPromise(): Promise<{}> во что-то простое, как это loginPromise(){ Я думаю, что оно все еще возвращает значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...