在 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)
}
我连续调用了三个服务。当我调用第三个服务时,我需要使用来自第一个服务响应的变量 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)
}