асинхронное обещание попробуй поймай жди возвращай путаницу - PullRequest
0 голосов
/ 09 июня 2019

У меня возникли проблемы с пониманием концепции асинхронных функций и способов их правильной реализации.

В приложении Angular у меня есть следующая функция в службе, которая разрешается правильно, но я запуталасьотносительно того, является ли эта реализация неправильной, и если нет, есть ли лучший подход для написания всего этого вместе.

Функция, упрощенная для ясности:

async doSomething(param:string): Promise<any> {
  this.activeParam = param;
  return this.doSomethingElse(param).then((response)=> {
    return Promise.resolve(response);
  }).catch((error) =>{
    return Promise.reject(error);
  });
}

И я вызываю эту функцию в моем компоненте следующим образом:

this.service.doSomething('setting').then((result) =>{     
        console.log('success:', result);
      },(error)=>{
        console.log('error:', result);
});

ОБНОВЛЕНИЕ

Мне нужно немного отдохнуть, прежде чем опубликовать этот вопрос, так как он изначально некорректен.

Поэтому я хотел бы добавить обновление, чтобы избежать путаницы с другими, сталкивающимися с подобными проблемами и появляющимися здесь какрезультат.

Во-первых, спасибо @MicheleLambertucci за то, что нашли время прояснить и дать исчерпывающий ответ.

Во-вторых, id хотел бы поделиться следующей ссылкой, в которой IMO объясняет асинхронные функции очень простым способом..

Await vs Return vs Return Await

И более подробно здесь от того же автора

1 Ответ

1 голос
/ 09 июня 2019

Прежде всего отбросьте возврат внутри обратных вызовов catch и then.Кроме того, вы ничего не делаете, кроме как возвращаете значения, что означает, что вы можете напрямую вернуть обещание:

doSomething(param: string): Promise<any> {
  this.activeParam = param;
  return this.doSomethingElse(param);
}

С учетом сказанного, поскольку вы используете функцию async, вы можете переписать эту функцию, используяawait.Это, по моему мнению, приведет к лучшему восприятию кода.

async doSomething(param: string): Promise<any> {
  this.activeParam = param;
  const response = await this.doSomethingElse(param);
  return response;
}

В этом рефакторе есть несколько моментов, на которые следует обратить внимание:

  • Когда вы await обещаете,возвращаемое выражение - это значение, а не обещание
  • Функция с await -едом выдает ошибку, если обещание было отклонено, что означает, что возвращаемое значение этой функции (обещание) выдает, если обещаниеотклонено (нет необходимости пытаться / поймать, так как вы просто передаете ошибку)
  • Ключевое слово async "обещает" функцию, таким образом, возвращение функции все еще является Обещанием (даже если responseзначение внутри функции)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...