Как передавать данные между электронным ipcMain и угловым ipcRenderer асинхронно с наблюдаемыми - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть процессы ipcMain и ipcRenderer (электронная и угловая стороны). Как я могу переписать свой код для асинхронного получения данных из основного процесса? Подключение к базе данных осуществляется с помощью typeorm

Сторона средства визуализации (data.service.ts):

constructor(private _electronService: ElectronService) {}

getItems(): Observable<Item[]> {
    return of(this._electronService.ipcRenderer.sendSync('get-items')).pipe(
      catchError((error: any) => Observable.throw(error.json))
    );
}

app.component.ts

@Component({
  selector: 'App',
  template: `<div style="text-align:center">
    <h1>
        Welcome to {{ title }}!
    </h1>
    <h2>Here is the contents of the database: </h2>
    <div>
        <ul style="list-style: none">
            <li *ngFor="let item of itemList">
                {{ item.name }}
            </li>
        </ul>
    </div>
</div>`
})

export class AppComponent implements OnInit {
  itemList: Item[];

  constructor(private appservice: AppService) {}

  ngOnInit(): void {
    console.log('component initialized');
    this.appservice.getItems().subscribe((items) => (this.itemList = items));
  }

Основная сторона (index.ts):

import { app, BrowserWindow, ipcMain } from 'electron';

import { createConnection } from 'typeorm';

import { Item} from './assets/model/item.schema';

const createWindow = async () => {
  const connection = await createConnection({
    type: 'mssql',
    host: 'server\\instance',
    username: 'sa',
    password: 'password',
    port: 1433,
    database: 'test',
    synchronize: true,
    logging: true,
    entities: [ Item ],
  });

  const itemRepo = connection.getRepository(Item);

  ipcMain.on('get-items', async (event: any, ...args: any[]) => {
    try {
      event.returnValue = await itemRepo.find();
    } catch (err) {
      throw err;
    }
  });
...