Как вернуть значение в then ()

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

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

[ts] A function whose declared type is neither 'void' nor 'any' must return a value.

Его необходимо вернуть, потому что вызывающей его функции потребуется 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.info(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.info("error: " + err);
    reject(err);
  });
 })
 return promise;
}
Тестирование функциональных 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
3
0
7 726
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Функция 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.info(err);
  });
}

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

this.login().then(
  user => console.info(user);
)

это сработало! Кроме того, у потребителя я добавил еще один .then(()=> { //do stuff });, чтобы код запускался только после завершения предыдущего бита.

Puremonk 07.11.2018 16:01

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

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

  return await this.loginPromise();
}

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