如何在承诺中返回修改后的结果作为承诺

Posted

技术标签:

【中文标题】如何在承诺中返回修改后的结果作为承诺【英文标题】:How to return a modified result in a promise as a promise 【发布时间】:2018-06-14 10:51:46 【问题描述】:

我正在使用带有 Alamofire 扩展的 promiseKit 6。在下面的函数中,我希望返回 Promise<JSON>(我使用 swiftyJson),但是来自 alamofire 调用的响应是一个包含元组的 Promise:Promise<(json: Any, response: PMKAlamofireDataResponse)>

当我从第一次得到它时,我怎样才能继续只返回 json 部分?谢谢:)

return firstly 
  self.requestClient.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON()
.then  arg in
  let (json, rsp) = arg
  return json

我也收到此错误:Cannot convert return expression of type 'Promise<_.T>' to return type 'Promise<JSON>' 上线:.then arg in ...

【问题讨论】:

【参考方案1】:

您应该将 Any 转换为 JSON,试试这个(未测试),但文档说您可以使用 map/compactMap https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md

return firstly 
    self.requestClient.request(url, method: .get, parameters: nil, 
          encoding: JSONEncoding.default, headers: nil).responseJSON()
.compactMap  data, rsp in
   return data as? JSON

【讨论】:

我正在使用 promisekit alamofire 扩展,因此请求返回类型为:Promise<(json: Any, response: PMKAlamofireDataResponse)> 当您调用 responseJSON() 时,我已经更新了问题 我认为是编译器类型的问题,但你能试试我更新的语法吗?你也可以尝试推断承诺类型 好,我去试试 进展如何? 为我解决了,但必须首先删除 in

以上是关于如何在承诺中返回修改后的结果作为承诺的主要内容,如果未能解决你的问题,请参考以下文章

如何按顺序执行承诺并返回所有结果[重复]

PromiseKit 如何将“when(resolved)”作为承诺返回?

Node.js / Javascript 多重递归承诺在视图中返回

如何在 node.js 中解决可变数量的承诺

承诺后的返回值[重复]

赛普拉斯:如何从自定义命令中获取返回值? (柏树承诺)