在 PromiseKit 中获取第一个响应对象然后完成块

Emr*_*der 3 xcode ios swift promisekit

我正在连续调用三个服务。当我调用第三个服务时,我需要使用第一个服务响应中的变量,即userModel. 我可以从中获得第二个服务响应,initModel但无法达到第一个模型userModel我的问题是 如何通过返回然后阻止在 done 块中使用 userModel ?

PS:我试图-> Promise<(UserModel,InstallationModel)>在第一次调用时返回,但因为UserModel已经是一个对象而不是一个承诺,我需要将它转换为承诺返回它。这看起来像我这样做的坏方法。

正如你所看到的,我正在存储它self.userModel = userModel,我不想这样做。

func callService(completionHandler: @escaping (Result<UserModel>) -> Void) {
    SandboxService.createsandboxUser().then { userModel -> Promise<InstallationModel> in
        self.userModel = userModel
        return SandboxService.initializeClient(publicKey: self.keyPairs.publicKey)
    }.then { initModel -> Promise<DeviceServerResponseModel> in
        self.initModel = initModel
        if let unwrappedUserModel = self.userModel {
            return SandboxService.deviceServerServiceCaller(authKey: initModel.token.token,apiKey:unwrappedUserModel.apiKey,privaKey: self.keyPairs.privateKey)
        }
        throw ServiceError.handleParseError()
    }.then { serverResponseModel -> Promise<UserModel> in
        if let unwrappedInitModel = self.initModel, let unwrappedUserModel = self.userModel {
            return SandboxService.sessionServiceCaller(authKey: unwrappedInitModel.token.token, apiKey: unwrappedUserModel.apiKey, privaKey: self.keyPairs.privateKey)
        }
        throw ServiceError.handleParseError()
    }.done { userModel in
        completionHandler(Result.success(userModel))
    }.catch { error in
        completionHandler(Result.error(error))
    }
}
Run Code Online (Sandbox Code Playgroud)

Emr*_*der 5

我还在 PromiseKit 页面 @Github 上打开了问题。我也从 Github 到这里分享 Mxcl 的答案。

func callService(completionHandler: @escaping (Result<UserModel>) -> Void) {
    SandboxService.createsandboxUser().then { userModel in
        firstly {
            SandboxService.initializeClient(publicKey: self.keyPairs.publicKey)
        }.then { initModel in
            SandboxService.deviceServerServiceCaller(authKey: initModel.token.token, apiKey: userModel.apiKey,privaKey: self.keyPairs.privateKey).map{ ($0, initiModel) }
        }.then { serverResponseModel, initModel in
            SandboxService.sessionServiceCaller(authKey: initModel.token.token, apiKey: userModel.apiKey, privaKey: self.keyPairs.privateKey)
        }
    }.pipe(to: completionHandler)
}
Run Code Online (Sandbox Code Playgroud)