Javascript Angular 4/5如何实现基于优先级的Http请求队列

Javascript Angular 4/5如何实现基于优先级的Http请求队列,javascript,angular,typescript,Javascript,Angular,Typescript,在拦截器中尝试 import { Injectable } from '@angular/core'; import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; import { finalize } from 'rxjs/operators'; @Injectable()

在拦截器中尝试

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';

import { Observable } from 'rxjs/Observable';
import { finalize } from 'rxjs/operators';

@Injectable()
export class HttpRequestsInterceptor implements HttpInterceptor {

    requestQueue = [];
    reqCount: number = 0;
    reqFlag: boolean = false;
    prevCount: number = 0;
    obsIntrReq: any;

    intercept(req: HttpRequest<any>, next: HttpHandler):
        Observable<HttpEvent<any>> {
        this.prevCount++;
        if (this.prevCount >= 4) {
            this.requestQueue.push(req);
            this.obsIntrReq = Observable.interval(1000).do(() => {
                if (this.reqFlag) {                    
                    this.requestQueue.splice(0, 1);
                    return next.handle(this.requestQueue[0]);
                }
            })
                .switchMap(() => this.intervalPreviewChecking(this.reqCount, this.requestQueue.length))
                .subscribe(() => { });
        } else {
            return next.handle(req).pipe(
                finalize(() => {
                    this.prevCount--;
                })
            );
        }

    }

    intervalPreviewChecking(rCount, requestQueueLength) {
        if (requestQueueLength == 0) {
            this.prevCount = 0;
            this.reqFlag = false;
            this.obsIntrReq.unsubscribe();
            return this.obsIntrReq = null;
        }
        if (this.prevCount < 4) {
            this.reqFlag = true;
            return Observable.of(true);
        }
        this.reqFlag = false;
        return Observable.of(false);
    }
}
从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpEvent,HttpInterceptor,HttpHandler,HttpRequest};
从“rxjs/Observable”导入{Observable};
从“rxjs/operators”导入{finalize};
@可注射()
导出类HttpRequestsInterceptor实现HttpInterceptor{
requestQueue=[];
reqCount:number=0;
reqFlag:boolean=false;
prevCount:数字=0;
obsIntrReq:任何;
拦截(请求:HttpRequest,下一步:HttpHandler):
可观察{
这个.prevCount++;
如果(this.prevCount>=4){
这个.requestQueue.push(req);
this.obsintreq=可观测的.interval(1000).do(()=>{
如果(this.reqFlag){
this.requestQueue.splice(0,1);
返回next.handle(this.requestQueue[0]);
}
})
.switchMap(()=>this.intervalPreviewChecking(this.reqCount,this.requestQueue.length))
.subscribe(()=>{});
}否则{
返回next.handle(req.pipe)(
完成(()=>{
这是伯爵;
})
);
}
}
间隔预览检查(rCount、requestQueueLength){
如果(requestQueueLength==0){
这个.prevCount=0;
this.reqFlag=false;
此.obsIntrReq.unsubscribe();
返回this.obsIntrReq=null;
}
如果(此.prevCount<4){
this.reqFlag=true;
可观察的返回(真);
}
this.reqFlag=false;
可观察到的返回(错误);
}
}

每次HTTP调用都会调用拦截器

如果我必须对我的呼叫进行优先级排序,我不会在拦截器中这样做,而是在我的功能中这样做

我就是这样做的(顺序=请求的优先级)


嗨,谢谢你的回复。。实际上,我想将我的请求排队,一次只发送4个请求,其余的请求应该在队列中。一旦4中的一个请求完成,队列中基于优先级的下一个请求应该被发送。因此,基本上,您会拒绝用户3次的请求,然后您会遵守他的请求吗?为什么?在我的例子中,我有一个叫做预览的功能,它可以将HTML转换成pdf,用户可以提出多个请求。但当用户提出更多请求时,我的登录ping请求落在队列的最后一个,从而导致用户注销。
const calls: {order: number, call: any}[] = [];

calls.push({order: 0, call: this.myService.makeCall(0) });
calls.push({order: 1, call: this.myService.makeCall(1) });
// etc. 

const orderedCalls = calls.sort((a, b) => a.order - b.order).map(call => call.call);

Observable.forkJoin(orderedCalls);