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

埃米尔·恩德(EmreÖnder)

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

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

如您所见,我正在存储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))
    }
}
埃米尔·恩德(EmreÖnder)

我还在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)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在jmeter中通过Beanshell从响应休息服务中获取第一个json对象

从对象数组中获取第一个对象

按住并释放按钮代码将继续运行第一个动画完成块

根据第一个API响应对每个数组元素发出API请求

如何获取第一个成功完成的未来?

我能以某种方式在第一个“ then”中获取获取响应吗?

Mongodb:如何从数据库中获取第一个文档,然后将其删除

在集合中获取第一个值然后将其删除的最快方法(大型集合)

检测第一个查询是否在 sql 中完成,然后运行第二个

如何获取 API 并打印响应数组中的第一个元素?

如何在Ajax响应中获取第一个元素的属性值?

在列中查找第一个和最后一个值,然后获取其旁边的值

从 vuejs 对象数组中获取第一个对象

对象数组,获取数组中的第一个对象

如何在角度 8 中获取对象内部的第一个对象

获取数组对象中第一个对象的键

如何从对象数组中获取第一个重复对象?

获取Xdocument对象中的X个第一个节点

获取满足条件的第一个对象

从结果数组php获取第一个对象

获取对象的第一个索引

解构以获取对象的第一个属性?

获取对象的第一个键?

从JSON文件获取第一个对象

[ArangoDB]:获取对象的第一个元素?

如何从ObservableCollection获取第一个对象?

访问对象中第一个键的第一个值

如何从 Talend 中的 JSON 数组中获取第一个对象

使用预设值初始化第一个 ajax 数据,然后从成功响应中传递它