Форум программистов, компьютерный форум, киберфорум
Angular/AngularJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137

Angular 6, rxjs, Обсерверы и Обсервируемые

26.06.2018, 10:05. Показов 1047. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Пишу Hello-World приложение на Angular, используя библиотеку socket.io. Официальных руководств не нашел, так что информацию брал просто из интернета. Ключевые файлы в проекте следующие:

websocket.service.ts
Кликните здесь для просмотра всего текста

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import { Injectable } from '@angular/core';
import * as io from 'socket.io-client';
import { Observable, Subject } from 'rxjs';
 
@Injectable()
export class WebsocketService {
  private host = 'localhost:5000';
  private socket;
 
  constructor() {}
 
  connect(): Subject<MessageEvent> {
  this.socket = io(this.host);
 
  const observable = new Observable(observer => {
    this.socket.on('message', (data) => {
      console.log("Данные пришли с сервера");
      observer.next(data); // Я вызываю next, но данные отправляются не на сервер, а подписчику
    })
  });
 
  const observer = {
    next: (data: Object) => { // next отправляет данные на сервер
      console.log('Отправка данных на сервер...');
      this.socket.emit('message', JSON.stringify(data));
    },
  };
 
  return Subject.create(observer, observable);
  }
}


chat.service.ts
Кликните здесь для просмотра всего текста

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { Injectable } from '@angular/core';
import { WebsocketService } from './websocket.service';
import { Observable, Subject } from 'rxjs';
import { map } from 'rxjs/operators';
 
@Injectable()
export class ChatService {
  messages: Subject<any>;
 
  constructor(private wsService: WebsocketService) {
    this.messages = wsService.connect();
  }
 
  sendMsg(msg) {
    this.messages.next(msg);
  }
}


app.component.ts
Кликните здесь для просмотра всего текста

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { Component, OnInit } from '@angular/core';
import { ChatService } from './chat.service';
 
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 
  constructor(private chat: ChatService){ }
 
  ngOnInit() {
    this.chat.messages.subscribe(msg => {
      console.log('Данные из подписки:');
      console.log(msg);
    });
  }
 
  sendMessage() {
    this.chat.sendMsg("Test Message");
  }
}


Следует отметить, что всё работает. Но почему работает - не ясно .

Конкретнее:
В websocket-сервисе определён объект observer с методом next. Его работа - отправлять сообщения на сервер. Этому методу подошло бы другое имя, но присвоить ему другое имя нельзя - возникает ошибка. Впрочем, ладно, это может быть связано с Subject.create. Дело-то в другом:
JavaScript
1
2
3
4
5
6
const observable = new Observable(observer => {
    this.socket.on('message', (data) => {
        console.log("Данные пришли с сервера");
        observer.next(data); // Я вызываю next, но данные отправляются не на сервер, а подписчику
    })
});
При получении сокетом сообщения, вызывается observer.next. Это тот же самый observer.next? Если да - почему он отправляет даные не на сервер, а подписчику? Если нет - откуда он берётся и почему имеет имя уже существующего элемента и вносит неразбериху в код?

Не по теме:

Понятно, что он и должен отправлять данные подписчику по логике приложения. Я не хочу пинговать сервер бесконечным потоком сообщений. Но я хочу понять, почему это делается именно методом observer.next.



Взять, например, тот же chat-сервис:
JavaScript
1
2
3
sendMsg(msg) {
    this.messages.next(msg);
}
Функция sendMsg использует метод next для отправки сообщения на сервер.

Прошу помочь разобраться!
Может быть есть официальная документация на этот счет? Желательно, конечно, на русском, но можно и на английском, лишь бы была понятная (это важно )
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2018, 10:05
Ответы с готовыми решениями:

На удаленную работу разыскивается программист TypeScript, JavaScript со знанием Angular JS, Material Angular and React J
Сегодня прислал друг из Лагоса: An AgTech startup is looking for a software developer for an exciting project Location: Remote ...

Failed to load resource: the server responded with a status of 404 (Not Found)
Добрый день Делаю все в среде IntelliJ Idea. Прикрепила к письму 2 файла. Самый простой пример вот от сюда...

При инициализации любого компонента шрифты подгружаются заново
Доброго дня, столкнулся с такой проблемой: при инициализации любого компонента, где используются импортируемые шрифты - они, по какой-то...

1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
27.02.2019, 13:58
Не совсем понимаю зачем вы такую структуру для такого простого действия сделали)

Можно было проще - чат сервис, который связан с сокет-сервисом (подписан на приход сообщений) и отдает во внешний мир обсервер на получение сообщения (а-ля как у вас в 1м файле, но чуть проще)

И еще метод в чат сервисе, который пушит на сервер сообщение

Относительно вашего вопроса

Цитата Сообщение от Nell_core Посмотреть сообщение
При получении сокетом сообщения, вызывается observer.next. Это тот же самый observer.next? Если да - почему он отправляет даные не на сервер, а подписчику? Если нет - откуда он берётся и почему имеет имя уже существующего элемента и вносит неразбериху в код?
Да, вы в рамках одного класса создали объект observer (с неймингом разберитесь еще, чтобы понятнее было) и потом в него пушите значение, которое он обрабатывает как вы задали - отправляя данные в
Code
1
this.socket.emit
Предлагаю вам временно (мысленно) отойти от ваших наработках и описать чего вы хотите достичь (цель и конкретизировать в пунктах)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2019, 13:58
Помогаю со студенческими работами здесь

DI в Angular
Angular 6. Доброго времени суток. Изучая Angular столкнулся с таким случаем: import { Component, Inject, OnInit } from...

Angular + C# mvc
Делаю в MVC по статье https://metanit.com/web/angular2/6.1.php , но выводит только текст, а сами данные не выводит. внизу скрин с...

Angular vs React
Ребят, подскажите, что лучше React или Angular? Я слышал, что новые версии Angular не поддерживают обратной совместимости. Поделитесь, у...

React vs Angular
Ребят, подскажите, что лучше React или Angular для Django? Я слышал, что новые версии Angular не поддерживают обратной совместимости....

Azure Angular JS
Здраствуйте ребята срочно нужна ваша помощь .... У меня есть проект на Angulare работает на локалке все хорошо ... Но на сервере выдает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru