在打字稿中添加网络服务调用之间的延迟
Adding a delay between webservice calls in typescript
我正在开发一个简单的 Web 应用程序,用于将大文件发送到服务器进行处理。处理可能会花费相当多的时间,超过我无法调整的服务器超时,所以我决定设计两种服务 - 一种将数据发送到服务器,另一种不断检查处理结果。但似乎持续检查占用了太多资源,浏览器开始变慢。这是代码:
try {
this.processService.processData(this.byteArray); //data sent for a processing
const processingResult: ProcessResult = new ProcessResult();
processingResult.traces = []
do {
this.processService.getResult().then(result => processingResult.traces = result?.traces);
} while (processingResult.traces.length === 0);
this.traces = processingResult.traces;
} catch (error) {
console.error(error);
}
}
}
在 TypeScript 中的 ws 调用之间添加某种延迟的最佳做法是什么?谢谢
delay(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
使用上述方法作为异步函数调用
async searchSomething() {
// webservice call 1
await this.delay(1000);
// webservice call 1
}
我推荐 interval
结合 skipWhile
和 take
。
// SERVER
let ready = false;
function veryLongServerRequest(): void {
timer(10000).subscribe(
() => ready = true,
);
}
function isServerReady(): Observable<boolean> {
return of(ready);
}
// CLIENT
veryLongServerRequest();
interval(500).pipe(
tap(i => console.log('Polling try ' + i)),
switchMap(() => isServerReady()),
skipWhile(b => !b),
take(1),
).subscribe(() => console.log('FINISHED!'));
查看正在运行的 Stackblitz:https://stackblitz.com/edit/rxjs-fqbwon?file=index.ts
编辑: 您可以将 skipWhile
+ take
简化为 first
查看正在运行的 Stackblitz:https://stackblitz.com/edit/rxjs-tc2ztd?file=index.ts
我正在开发一个简单的 Web 应用程序,用于将大文件发送到服务器进行处理。处理可能会花费相当多的时间,超过我无法调整的服务器超时,所以我决定设计两种服务 - 一种将数据发送到服务器,另一种不断检查处理结果。但似乎持续检查占用了太多资源,浏览器开始变慢。这是代码:
try {
this.processService.processData(this.byteArray); //data sent for a processing
const processingResult: ProcessResult = new ProcessResult();
processingResult.traces = []
do {
this.processService.getResult().then(result => processingResult.traces = result?.traces);
} while (processingResult.traces.length === 0);
this.traces = processingResult.traces;
} catch (error) {
console.error(error);
}
}
}
在 TypeScript 中的 ws 调用之间添加某种延迟的最佳做法是什么?谢谢
delay(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
使用上述方法作为异步函数调用
async searchSomething() {
// webservice call 1
await this.delay(1000);
// webservice call 1
}
我推荐 interval
结合 skipWhile
和 take
。
// SERVER
let ready = false;
function veryLongServerRequest(): void {
timer(10000).subscribe(
() => ready = true,
);
}
function isServerReady(): Observable<boolean> {
return of(ready);
}
// CLIENT
veryLongServerRequest();
interval(500).pipe(
tap(i => console.log('Polling try ' + i)),
switchMap(() => isServerReady()),
skipWhile(b => !b),
take(1),
).subscribe(() => console.log('FINISHED!'));
查看正在运行的 Stackblitz:https://stackblitz.com/edit/rxjs-fqbwon?file=index.ts
编辑: 您可以将 skipWhile
+ take
简化为 first
查看正在运行的 Stackblitz:https://stackblitz.com/edit/rxjs-tc2ztd?file=index.ts