我如何跳过最先请求的最后一个答复?

时间:2018-10-05 09:56:26

标签: angular typescript rxjs

每个请求使用以下代码;

def main_pods
    pod 'Fabric'
    pod 'Crashlytics'
    pod 'Firebase/Core'
end

target 'TargetName' do
    project 'Project.xcodeproj'
    main_pods

    # Move tests inside target block
    target 'TargetNameTests' do
        inherit! :search_paths # add custom flag
    end

    target 'TargetNameSwiftTests' do
        inherit! :search_paths # add custom flag
    end

    target 'TargetNameUITests' do
        inherit! :search_paths # add custom flag

        pod 'Utils', '~> 0.3.3'
        pod 'Pod', '~> 1.4.1'
    end
end

target 'OneMoreTargetName' do
    project 'Project.xcodeproj'
    main_pods
end

我想使用rxjs跳过B'响应。

Discription Image

2 个答案:

答案 0 :(得分:0)

不能肯定,如果我理解您的问题,但是我认为您可以使用switchMap来取消以前的发射。

确保不退还订阅!就像您在示例中所做的一样!

您可以做的是:

this.httpClient.get<any>(URL).pipe(
  swtichMap(data => data)
).subscribe(data => data) <= here you will get B

答案 1 :(得分:0)

假设您向同一个端点https://api.example.com/endpoint发出了两个请求:RequestARequestB

我们也将响应称为ResponseAResponseB

我可以想到两种解决方案。

案例1:通过查看它们的内容可以区分出ResponseA和ResponseB。

情况2:流不是结构化的,仅通过查看内容就无法推断出哪个响应。

案例1:您可以区分内容

该流看起来像{'name': 'B', ...} -> {'name': 'A', ...} -> {'name' : 'B', ...}。 那么最合适的是filter运算符:

// example of a stream
const source = this.httpClient.get<any>('http://api.example.com',
                                   {params: params, responseType: 'json'})

interval(2000) // could be replace by `fromEvent('someEvent')` for example
.pipe(
  take(10), // take only 10 first responses
  mergeMap(source),
  filter(element => element['name'] != 'B')
)
.subscribe(element=> console.log('Received name :', element['name'])

输出

  

“接收的名称:{'name':'A'}”

情况2:保持最快的响应速度

速度歧视:

// example of a stream
const source1 = this.httpClient.get<any>('http://api.example.com',
                                   {params: params, responseType: 'json'})
const source2 = this.httpClient.get<any>('http://api.example.com',
                                   {params: params, responseType: 'json'})

source1
.pipe(
  merge(source2),
  take(1)
)
.subscribe(resp=> console.log('fastest response :', resp)