gpt4 book ai didi

javascript - 带延迟的递归可观测方法

转载 作者:行者123 更新时间:2023-12-02 22:32:11 24 4
gpt4 key购买 nike

我正在尝试在 Angular 8 中创建带有延迟的递归服务器连接方法。

我尝试过这个:

public connectToServerSafely(): Observable<boolean> {
if (this.isConnecting) {
return this.connectToServerSafely().pipe(delay(5000));
} else if (this.isConnected) {
return of(true);
} else {
return this.connectToServer();
}
}

connectToServer 方法返回 Observable< boolean> 的位置取决于连接成功或失败。

问题是这个延迟方法,我不知道为什么,但我面临着近 2000 次 connectToServerSafely() 方法的调用,直到建立连接。 1 秒后建立连接。

为什么delay方法并没有真正推迟connectToServerSafely方法的递归调用(类似于setTimeout方法)?

最佳答案

this.connectToServerSafely().pipe(delay(5000))不会阻止函数调用自身。 delay 运算符只会延迟发出的值

这是我的方法:

let isConnecting = true;
let isConnected = false;

timer(2000)
.subscribe(() => (isConnecting = false, isConnected = true));

function connSafely ()/* : Observable<any> */ {
console.warn('calling `connSafely`');

if (isConnecting) {
return timer(500).pipe(concatMap(() => connSafely()))
}

if (isConnected) {
return of(true);
}

return connectToServer();
}

function connectToServer () {
isConnecting = true;

return of('connecting');
}

connSafely().subscribe();

console.warn("calling 'connSafely'") 应调用 5 次(1 次表示初始函数调用 1 次 4,因为 2000/500 = 4)。

注意:使用 higher-order mapping operators 之一非常重要(switchMap, concatMap, mergeMap/flatMap, exhaustMap) 为了使确保所有后续函数调用都会自动订阅/取消订阅。

尝试使用tap(() => connSafely()),您应该只会在控制台中看到两次消息。

StackBlitz 。 (向下滚动直到找到示例)

关于javascript - 带延迟的递归可观测方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58857012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com