Angular: понимание того, когда подписываться при отправке данных

Я действительно запутался и задумался, может ли кто-нибудь помочь мне попытаться понять .subscribe в angular 2 rxjs.

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

Насколько я понимаю, когда вы подписываетесь, затем снова нажимаете кнопку, у вас будет 2 экземпляра подписки и так далее. Теперь я знаю, что вы собираетесь сказать, ну, вы можете убить подписку в уничтожении или что-то еще, но это не мой вопрос.

Мой вопрос: если форма никогда не уничтожается до тех пор, пока вы не нажмете кнопку «Домой» и форма не будет очищена при отправке для отправки дополнительных данных, нужно ли мне использовать «Обещание вместо подписки»? Поскольку подписка (насколько я понимаю) подобна информационному бюллетеню, чем больше вы нажимаете кнопку «подписаться», тем больше вхождений информационного бюллетеня вы получите.

Итак, что лучше всего отправлять данные снова и снова, не имея нескольких подписок?

myObsFunc (dataToSend) .subscribe (err => console.log (err), () => console.log (успех));

or

myObsFunc (dataToSend) .toPromise (). then (). catch (e => console.log (e));


person Naran    schedule 23.03.2018    source источник
comment
Чего вы пытаетесь достичь? На что вы подписываетесь при нажатии кнопки?   -  person Questioning    schedule 24.03.2018
comment
Что ж, это правда, но вы всегда можете отключить кнопки, пока не получите ответ на текущий запрос или что-то подобное, если вы не хотите, чтобы в итоге получилось несколько наборов результатов.   -  person cyberpirate92    schedule 24.03.2018
comment
Для формы вы можете использовать ngSubmit, например: ‹form [formGroup] = myForm (ngSubmit) = myFunction ()›. Вам не нужно подписываться или создавать обещания.   -  person Farasi78    schedule 24.03.2018
comment
Вам нужно использовать подписку и отписаться только при работе с Observables.   -  person Shubham Agarwal Bhewanewala    schedule 24.03.2018
comment
О, хорошо, так что вы говорите, что если я отправляю почтовый запрос на бэкэнд, мне просто нужно позвонить по моей подписке, но не подписаться, например: myObsFunction (dataToSend), а не myObsFunction (dataToSend) .subscribe ()? но тогда как мне проверить, было ли оно успешным или нет?   -  person Naran    schedule 02.04.2018
comment
Я в основном пытаюсь сохранить некоторые данные в бэкэнде каждый раз, когда нажимаю «Отправить», поэтому у меня есть наблюдаемая функция, но я пытаюсь решить, должен ли я подписываться на отправку данных или использовать или обещать. поскольку мне нужно проверить, было ли оно успешным или нет.   -  person Naran    schedule 02.04.2018
comment
Для отправки запроса вам необходимо подписаться. Вызов toPromise () действительно подписывается. Я предпочитаю использовать более мощные наблюдаемые объекты, но вы можете вызвать toPromise (), если хотите. Как только наблюдаемое завершение или ошибки, то есть как только ответ HTTP вернется, вы автоматически отмените подписку. Так что вам не стоит беспокоиться об отмене подписки из наблюдаемых HTTP, которые завершаются почти сразу.   -  person JB Nizet    schedule 02.04.2018


Ответы (2)


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

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

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

person Shubham Agarwal Bhewanewala    schedule 24.03.2018
comment
Я понимаю, о чем вы говорите, но в случае, если я просто отправляю сообщение, отправляя некоторые данные на бэкэнд, как я могу это сделать с помощью наблюдаемой функции? или наблюдаемый неправильный способ отправки данных, чтобы увидеть, был ли он успешным? поскольку у меня есть приложение, и члены моей команды подписываются на наблюдаемое на странице, которая просто отправляет данные снова и снова, поэтому, на мой взгляд, мы создаем подписки без надобности и существуют до тех пор, пока я не откажусь от подписки. - person Naran; 02.04.2018
comment
используйте функцию take от rjxs, чтобы отказаться от подписки сразу после завершения подписки, и используйте метод подписки - person Shubham Agarwal Bhewanewala; 02.04.2018

Наблюдаемый - это потоковые данные. Надеюсь, этот код поможет вам это понять.

import {timer} from "rxjs/observable/timer";

let observable = timer(1, 1000); //timer will emit an event each second

let subscribtion = observable.subscribe((data) => {
  //do stuff for each tick of stream data
  console.log(data);
}, (reason) => {
  //when there was an error while watching observable
}, () => {
  //do stuff when stream is complete
});

//when you need to unsubscribe from this events you can call
subscribtion.unsubscribe();
person Vayrex    schedule 23.03.2018
comment
Я понимаю эту концепцию, но в моем сценарии лучше всего подписаться, чтобы отправлять данные на серверную часть, или использовать обещание? Не забывайте, что эта функция подписки находится на кнопке под названием submit, поэтому, если я вызываю submit 3 раза (без отмены подписки каждый раз), у меня будет 3 подписки, правильно? - person Naran; 31.03.2018
comment
Ребята уже сказали, что при нажатии на кнопку подписываться не нужно. Вам нужно сделать http-вызов, который может быть в компоненте или лучше в каком-то сервисе. Тогда вам необходимо подписаться на ответ службы. Что касается меня http-ответ (как мы к нему привыкли), это одноразовая подписка, это не поток с количеством событий, и кажется, что обещание в этом случае лучше, но наблюдаемый rxjs имеет количество операторов (общий оператор для обработки на стороне сервера ответ карта). Так что лучше использовать Observables везде в проекте ng2 / 5, даже если это разовое событие. - person Vayrex; 01.04.2018
comment
Разместите свой код, чтобы люди могли правильно понять ваши потребности. - person Vayrex; 01.04.2018