RxAlamofire 请求在我第二次调用该函数时没有被触发

Posted

技术标签:

【中文标题】RxAlamofire 请求在我第二次调用该函数时没有被触发【英文标题】:RxAlamofire request is not fired for the second time i call the function 【发布时间】:2019-03-17 17:23:24 【问题描述】:

我有一个应该返回 Observable 的函数。当我第一次调用该函数时,一切正常,我收到了预期的结果,但是第二次我想使用不同的参数发出相同的请求,该函数会自动返回与以前相同的响应,但它没有完全触发请求。嵌套了多个请求,因为每个新请求都依赖于前一个的结果。

看起来像这样:

func request1() -> Observable<String> 
    return RxAlamofire
            .requestString(.get, url)
            .map  (response, html) -> Result<String> in
                .....
                return newUrl
            


private func request2(credentials: Credentials) -> Observable<String> 
   return request1()
            .flatMapLatest  (newUrl)

                return RxAlamofire
                    .requestString(.get, newUrl)
                    .flatMapLatest  (response, _) -> Observable<String> in

                        let params = ["username": credentials.username, "password": credentials.password]

                        return RxAlamofire
                            .requestString(.post, (response.url?.absoluteString)!, parameters: params)
                            .flatMapLatest  (response2,str) -> Observable<String> in

                                ... some code formating ...

                                return RxAlamofire
                                    .requestString(.post, actionUrl!, parameters: anotherParameters)
                                    .map  return result 
                        
                
        
    

当我调用它时,它看起来像这样:

result = someObservable.flatMapLatest  return ScrapingService.request2(credentials: $0) 

当我触发“someObservable”时,它会按预期运行 request2,但未发出实际请求。

最后我对结果执行 onNext。

【问题讨论】:

【参考方案1】:

当我调用它时,它看起来像这样:

result = someObservable.flatMapLatest  return ScrapingService.request2(credentials: $0) 

你不是在这里“调用”observable。你只是在创造它。为了从 Observable 中获取结果,您必须订阅它。

【讨论】:

我明白了,我认为 flatMapLatest 会触发它,当我订阅“结果”时,结果会是一样的。如果我想将 request2 的结果分配给某个 observable,然后订阅 observable,它会被触发吗?像这样: observable = ScrapingService.request2(..) observable.subscribe(onNext: ) 我不知道我的概念是否正确。 是的,可以。通过使用flatMapLatest,您声明了对 Observable 的转换,但您仍然需要订阅。这被称为“冷” Observable,即在订阅之前不会开始发射。您可以在此处阅读有关“热”与“冷”可观察对象的更多信息:reactivex.io/documentation/observable.html 谢谢你,这对我帮助很大!

以上是关于RxAlamofire 请求在我第二次调用该函数时没有被触发的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我第二次使用完全相同的参数调用 IMMUTABLE 函数时,计划时间会加倍?

为啥 MySQL 查询在我第二次运行时更快?

Jquery .animate() 在我第二次触发它时不起作用

单击第二次链接PrimeFaces时,构造函数不会调用

当我第二次实例化预制件时,为啥会出现错误?

如何使用 RxAlamofire 取消先前的请求?