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

Get first response object in PromiseKit then done block

我连续调用了三个服务。当我调用第三个服务时,我需要使用来自第一个服务响应的变量 userModel。我可以获得 initModel 的第二个服务响应,但无法到达第一个模型 userModel我的问题是如何通过return在完成块中使用 userModel 然后块?

P.S: 我在第一次调用时尝试 return -> Promise<(UserModel,InstallationModel)> 但是因为 UserModel 已经是一个对象而不是promise,我需要将其转换为 promise to return 它。这看起来像我一个糟糕的方法。

如您所见,我将其与 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))
    }
}

我不熟悉 PromiseKit,但由于它是一个框架,您无法真正以可以在 .done 方法的回调中包含 userModel 的方式编辑方法.所以我要做的是,在 class 中声明一个可选值,其中此代码块使用 userModel 类型执行,然后将其设置为从第一次调用接收到的值,然后在使用后将其设置回 nil它在第二个。喜欢以下内容:

假设 userModel 的类型是 UserModel。

final class SampleFetcher {
    let userModel: UserModel?

    func fetch() {
        SandboxService.createsandboxUser().then { userModel in
            SandboxService.initializeClient()
            // save userModel here.
            userModel = userModel
            }.done { initModel in
                // Use it here
                guard let userModel = userModel else {
                    return
                }
                SandboxService.deviceServerServiceCaller(secretID: "")
                // after you are done, set it to nil
                userModel = nil
            }.catch { error in
        }
    }
}

如果它不是一个框架,您可以通过在第二个回调中包含 userModel 的方式编写函数。

我还在 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{ ([=10=], initiModel) }
        }.then { serverResponseModel, initModel in
            SandboxService.sessionServiceCaller(authKey: initModel.token.token, apiKey: userModel.apiKey, privaKey: self.keyPairs.privateKey)
        }
    }.pipe(to: completionHandler)
}