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



我连续调用三个服务。当我调用第三个服务时,我需要使用来自第一个服务响应的变量,该变量userModel。我可以得到第二个服务响应,从中initModel但无法到达第一个模型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))
}
}

我也在 PromiseKit 页面 @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)
}

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

让我们假设用户模型的类型是用户模型。

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的方式编写函数。

相关内容

最新更新