Задать вопрос
@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()) при уничтожении компонента.

Первый способ логичнее потому что возвращает результат только один раз. Но минус его в том, что внутри промиса всё равно есть подписка на поток.
  • Вопрос задан
  • 92 просмотра
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Javascript.ru
    Курс по Angular
    6 недель
    Далее
  • Skillfactory
    Профессия Frontend-разработчик PRO
    14 месяцев
    Далее
  • Компьютерная академия «TOP»
    Frontend разработка
    12 месяцев
    Далее
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
Второй способ мне не нравится тем, что приходится для одноразовой операции использовать подписку на поток, которая будет действовать долгое время. Кроме того придётся писать код для отписки(unsubscribe()) при уничтожении компонента.


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

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

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

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