Задать вопрос
@zlodiak

Для одноразовой операции использовать promise или rx?

У меня есть 2 варианта решения одной задачи. Скажите пожалуйста какой из способов правильнее и экономнее.

Способ 1:
В сервисе есть функция, которая создаёт запись в БД и возвращает её:
createQuestion_(question: Question): Promise<Question> {
  return new Promise((resolve, reject) => {
    this.httpClient.post('http://localhost:3000/questions', question)
      .subscribe((resp) => {
        resolve(resp);
      });
  });
}


в компоненте вызов её происходит так:
const question: Question = {
  author: authorizedUser.id,
  isDecided: false,
  isDeleted: false,
  tags: [],
  title: this.form.value.title,
  body: this.form.value.question,
  ratingPlus: [],
  ratingMinus: [],
  createdDateUnix: '' + Date.now()
};

this.questionsService.createQuestion_(question).then((resp) => {
  this.router.navigate(['/question/' + resp.id], {queryParams: {
    questionCreateNow: true
  }});
});


Способ 2:
Сервис:
createQuestion(question: Question): Observable<Question> {
    return this.httpClient.post('http://localhost:3000/questions', question);
  }


вызов из компонента:
this.questionsService.createQuestion(question).subscribe((resp) => {
	this.router.navigate(['/question/' + resp.id], {queryParams: {
	  questionCreateNow: true
	}});
});


Второй способ мне не нравится тем, что приходится для одноразовой операции использовать подписку на поток, которая будет действовать долгое время. Кроме того придётся писать код для отписки(unsubscribe()) при уничтожении компонента.

Первый способ логичнее потому что возвращает результат только один раз. Но минус его в том, что внутри промиса всё равно есть подписка на поток.
  • Вопрос задан
  • 105 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Учебный центр IBS
    WEB-022 Разработка на Angular. Продвинутый уровень
    1 неделя
    Далее
  • Академия Эдюсон
    Frontend-разработчик + ИИ
    9 месяцев
    Далее
  • МИПО
    Бакалавриат Веб-разработка
    54 месяца
    Далее
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
Второй способ мне не нравится тем, что приходится для одноразовой операции использовать подписку на поток, которая будет действовать долгое время. Кроме того придётся писать код для отписки(unsubscribe()) при уничтожении компонента.


С чего бы это? у Http класса на методы вызывается complete сразу по завершению, поэтому код аналогичен .first().subscribe(...)

смотреть исходник
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы