BehaviourSubject возвращает [объект][объект], когда он подписан

#javascript #angular

Вопрос:

Я работаю с банковским API для оплаты.банки хотят ответить, что он запретит платить JavaScript, который выполнит перенаправление HTTP в верхнем кадре на completeUrl. какой полный URL-адрес я должен предоставить банковскому api для отправки своих response.in мое приложение.компонент.ts

 this.http.post("BankEndURL",quote,).subscribe(s=gt;{  //here i get quote   this.newpay=s;    //here im passing the paymentID to my service in angular to store there,because   at the end of the transaction ,if its successful i need it to show the transaction data  this.dataService.setData(s);  //here i send a quote to backend to give me a bankurl with payment data  this.http.post("SecondBakednURL",this.newpay).subscribe(s=gt;{    this.payaddress= s['reDirectAuthorizationHref'];  //here i open the url to redirect the user to the payment portal  window.open(this.payaddress);  

вот сервис, который я создал :

 public sharedData = new BehaviorSubjectlt;anygt;(null);  

конструктор() {}

 getData(){   return this.sharedData;  }  setData(data:any){ this.sharedData.next(data); }  

и вот мой компонент получателя,тот,который банк поразит его, как только транзакция будет успешной, я собираюсь показать данные транскрипции пользователя

 constructor(private dataService:DataService) {}   ngOnInit(): void {  this.dataService.getData().pipe(  filter(data =gt; !!data)  ).subscribe(data =gt; {  alert(data)  });  

но данные здесь возвращают значение null

Комментарии:

1. Это экземпляр BehaviorSubject , и когда вы его используете alert() , он показывает вам его строковое представление [object object] . Вы можете использовать console.log() , а не alert() для получения более подробной информации. Если вы хотите получить данные в потоке, вам нужно использовать subscribe() его метод, как вы сделали в HTTP-запросе.

2. Вы используете оператор, который также преобразует объект в строку. Вы можете использовать console.log('the object', data)

3. Это происходит потому, что вы начинаете тему со значения null . Если вы не позвоните setData() со значением, оно останется null , и каждый новый абонент получит последнее значение, которое является null

4. имеет post ли значение «url»? если нет, то setData не будет называться, и ваша тема останется null

5. обновил свой вопрос

Ответ №1:

В этом случае getSharedData() возвращает сам объект поведения, поэтому разумно в этом случае подписаться на него, чтобы получать данные, которые вы отправляете при вызове setData .

В компоненте приемника:

 ngOnInit(): void {  this.dataService.getData().pipe(  filter(data =gt; !!data)  ).subscribe(data =gt; {  alert(data)  }); }  

Комментарии:

1. он показывает ноль ,черт возьми

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

3. предупреждение не срабатывает,я думаю, это потому, что данные пусты

4. Хорошо, значит this.http.post("url", quote) , вызов не попадает в обработчик подписки, это может произойти из-за ошибки http. Откройте консоль браузера, перейдите на вкладку сеть и посмотрите, сможете ли вы найти соответствующий запрос. Может быть, он действительно возвращает null с сервера.

5. спасибо за ваши комментарии,я нашел их очень полезными и многому научился,оказалось,что с тех пор,как мой URL попал в банк,откроется новая вкладка,и возникла проблема, не удалось перенести данные между двумя вкладками, я использовал локальное хранилище для сортировки проблемы, глупо, но, похоже, работает!