如何以简洁易读的方式按顺序链接可观察量

dub*_*eat 2 promise swift rx-swift

我是 RXSwift 的新手,我已经开始研究如何执行类似函数链接的 Promise。

我认为使用平面图我走在正确的轨道上,但我的实现很难阅读,所以我怀疑有更好的方法来完成它。

我这里的东西似乎有效,但我很头痛,如果我在链中添加另外 3 个或多个函数,它会是什么样子。

这是我声明我的“承诺链”的地方(很难阅读)

LOGIN().flatMap{ (stuff) -> Observable<Int> in
    return API(webSiteData: stuff).flatMap
    { (username) -> Observable<ProfileResult> in
    return accessProfile(userDisplayName: username) }
    }.subscribe(onNext: { event in
        print("The Chain Completed")
        print(event)
    }, onError:{ error in
         print("An error in the chain occurred")
    })
Run Code Online (Sandbox Code Playgroud)

这些是我链接的 3 个示例函数

struct apicreds
{
    let websocket:String
    let token:String
}
typealias APIResult = String
typealias ProfileResult = Int

// FUNCTION 1
func LOGIN() -> Observable<apicreds> {

    return Observable.create { observer in
        print("IN LOGIn")
        observer.onNext(apicreds(websocket: "the web socket", token: "the token"))
        observer.on(.completed)
        return Disposables.create()
    }
}
// FUNCTION 2
func API(webSiteData: apicreds) -> Observable<APIResult> {

    return Observable.create { observer in
        print("IN API")
        print (webSiteData)
       // observer.onError(myerror.anError)
        observer.on(.next("This is the user name")) // assiging "1" just as an example, you may ignore
        observer.on(.completed)
        return Disposables.create()
    }

}
//FUNCTION 3
func accessProfile(userDisplayName:String)  -> Observable<ProfileResult>
{
    return Observable.create { observer in

        // Place your second server access code
        print("IN Profile")
        print (userDisplayName)

        observer.on(.next(200)) // 200 response from profile call
        observer.on(.completed)
        return Disposables.create()
    }
}
Run Code Online (Sandbox Code Playgroud)

Ani*_*nil 5

这是我们在链接操作时遇到的一个非常常见的问题。作为初学者,我也在我的项目中使用 RxSwift 编写了类似的代码。有两个方面需要改进 - 1. 重构代码以删除嵌套的 flatMap 2. 以不同的方式格式化它以使序列更易于遵循

LOGIN()
    .flatMap{ (stuff) -> Observable<APIResult> in
        return API(webSiteData: stuff)
    }.flatMap{ (username) -> Observable<ProfileResult> in
        return accessProfile(userDisplayName: username) 
    }.subscribe(onNext: { event in
        print("The Chain Completed")
        print(event)
    }, onError:{ error in
        print("An error in the chain occurred")
    })
Run Code Online (Sandbox Code Playgroud)