gpt4 book ai didi

angular - Http 请求的加载指示器

转载 作者:太空狗 更新时间:2023-10-29 18:33:37 26 4
gpt4 key购买 nike

我的问题的根源是在 http 请求上显示加载指示器,我想在服务级别执行此操作,而不必为每个组件编写代码。我所做的是实现一个基本上执行此操作的 http 包装器:

getMyHttpObservable(...) {
setLoadingIndicator(true);
const myHttpObservable =
createRequestObservable().finally(()=> {
console.log('http done');
setLoadingIndicator(false);
});
return myHttpObservable;
}

我有一系列使用 Observable.concat 链接的可观察对象,如下所示:

const t1 = Observable.timer(5000).finally(()=>console.log('t1 done'));
const t2 = getMyHttpObservable(...);
const agg = Observable.concat(t1,t2);

我正在使用基于事件的取消技术,使用 Observable.takeUntil 如下:

const ev = new EventEmitter<any>();
const cancellableAgg = agg.takeUntil(ev.asObservable());

现在的问题是,当我在第一个计时器期间取消聚合可观察对象时,我没有得到第二个可观察对象的最终调用 - http 请求。示例:

const cancel = Observable.timer(500).finally(()=>ev.emit());
cancellableAgg.subscribe();
cancel.subscribe();

当上面运行时,我得到这个输出:

t1 done

我还需要完成 http ,以便清除加载指示器。我怎样才能做到这一点?

谢谢!

编辑

我没有意识到 concat 运算符仅在其前任完成时才订阅 observables。我需要的是仅当实际订阅了 http observable 时才激活我的加载指示器。

我修改了我的包装函数如下:

getMyHttpObservable(...) {
const myHttpObservable = createRequestObservable(...);
const subscriptionAware = new Observable(subscriber => {
setLoadingIndicator(true);
myHttpObservable.subscribe(
nextEv => subscriber.next(nextEv),
errEv => subscriber.error(errEv),
() => subscriber.complete())
.add(()=>setLoadingIndicator(false));
};
return subscriptionAware;
}

所以基本上,我正在创建一个 Observable,它透明地包装另一个 Observable,但在实际订阅时也会执行一些额外的操作 - 激活加载指示器。

但是,现在我已经失去了在飞行中取消 XHR 请求的能力,因为 Observable 的构造函数不允许我传递取消处理程序,所以内部订阅永远不会得到已取消。

关于如何实现这一点有什么想法吗?

最佳答案

设法使用内置的 defer 运算符找到解决方案,该运算符等待订阅并返回一个新的可观察对象:

getMyHttpObservable(...) {
const myHttpObservable = createRequestObservable(...);
return Observable.defer(() => {
setLoadingIndicator(true);
return myHttpObservable.finally(() => setLoadingIndicator(false));
});
}

优雅而简短。

关于angular - Http 请求的加载指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39190672/

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