sql-server - 如何使用 observables 在电子 ipcMain 和角度 ipcRenderer 之间异步发送数据
问题描述
我有一个 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;
}
});
解决方案
这对我有用:
data.service.ts(角度)
import { Injectable } from '@angular/core';
import { IpcRenderer } from 'electron';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private ipc: IpcRenderer;
constructor() {
if ((<any>window).require) {
try {
this.ipc = (<any>window).require('electron').ipcRenderer
} catch (error) {
throw error;
}
} else {
console.warn('Could not load electron ipc');
}
}
getData() {
return new Observable<any>(observer => {
this.ipc.once('getDataResponse', (event, arg) => {
observer.next(arg);
});
this.ipc.send('getData');
});
}
}
main.ts(电子)
import { app, BrowserWindow, ipcMain } from 'electron';
import * as path from 'path';
import * as url from 'url';
let win: BrowserWindow;
app.on('ready', createWindow)
app.on('activate', () => {
if (win === null) {
createWindow();
}
});
function createWindow() {
win = new BrowserWindow({
width: 800,
height: 600,
frame: false,
webPreferences: {
nodeIntegration: true // <-- important
}
});
win.loadURL(
url.format({
pathname: path.join(__dirname, `/../../dist/myApp/index.html`),
protocol: 'file:',
slashes: true,
})
);
win.webContents.openDevTools();
win.on('closed', () => {
win = null;
});
}
ipcMain.on('getData', (event, args) => {
event.reply('getDataResponse', {
data: [
{
name: 'test'
}
]
});
});
推荐阅读
- ios - 如何在多值部分获取行顺序信息?
- azure - Azure SQL 中的“用户登录失败”为“打开时底层提供程序失败”
- amazon-web-services - 如果收到消息,AWS SQS 长轮询是否会提前返回?
- reactjs - 通过键过滤对象的对象
- spring - 在spring boot中每月自动创建带有后缀的实体
- x86-64 - 带 SSE 的 8 位 LERP
- java - 构建 Java netty SslContext 和 apache SSLContexts 以信任来自动态 .pem 文件的证书,而无需预加载信任库
- javascript - Chrome/Safari 基本测试:使用 IP 地址而不是 localhost 时,CSS、Javascript、图像不起作用,因为它正在“https”中查找文件
- google-apps-script - 在 Google Appscript 中抓取具有特定文件名的多个附件
- python - 无论如何我可以使输出更易于阅读,Reading Data from 1000+ JSON files