【问题标题】:How to wait for multiple futures to complete in Vapor Swift?如何在 Vapor Swift 中等待多个期货完成?
【发布时间】:2019-08-12 13:16:26
【问题描述】:

我想弄清楚如何等待多个期货完成。 我知道如何异步等待他们: summaryFuture.whenSuccess {} 但这只是处理一种情况。我需要等待summaryFuture 和sponsorFuture 都完成,然后在发回响应之前同时处理两者。

  let summaryFuture = client.post(summaryURL) { post in
        post.http.headers.add(name: "authtoken", value: token)
        }.flatMap(to: SummaryModel.self) { (response) in
            return try response.content.decode(SummaryModel.self)
    }

  let sponsorEnrollerFuture = client.post(sponsporEnroller) { post in
        post.http.headers.add(name: "authtoken", value: token)
        }.flatMap(to: SponsorEnrollerModel.self) { (response) in
            return try response.content.decode(SponsorEnrollerModel.self)
    }

【问题讨论】:

    标签: swift xcode vapor


    【解决方案1】:

    好的。我想到了。

    要等待多个期货完成,您必须使用.add。在我的特殊情况下。

     let summaryFuture = client.post(summaryURL) { post in
            post.http.headers.add(name: "authtoken", value: token)
            }.flatMap(to: SummaryModel.self) { (response) in
                return try response.content.decode(SummaryModel.self)
        }
    
      let sponsorEnrollerFuture = client.post(sponsporEnroller) { post in
            post.http.headers.add(name: "authtoken", value: token)
            }.flatMap(to: SponsorEnrollerModel.self) { (response) in
                return try response.content.decode(SponsorEnrollerModel.self)
        } 
    
      // Now combine the two futures
     let multipleFutures = summaryFuture.add(sponsorEnrollerFuture)
    
     // Now I can use
     mutipleFutures.whenSuccess = {(summary, sponsorEnroller) in ...}
    

    【讨论】:

      【解决方案2】:

      您可以使用.and.flatten

      对于.flatten,您的期货应该返回Void,因此最终结果也将是Future<Void>

      .and可以这样使用

      let summaryFuture = client.post(summaryURL) { post in
          post.http.headers.add(name: "authtoken", value: token)
      }.flatMap(to: SummaryModel.self) { (response) in
          return try response.content.decode(SummaryModel.self)
      }
      
      let sponsorEnrollerFuture = client.post(sponsporEnroller) { post in
          post.http.headers.add(name: "authtoken", value: token)
      }.flatMap(to: SponsorEnrollerModel.self) { (response) in
          return try response.content.decode(SponsorEnrollerModel.self)
      } 
      
      // Now combine the two futures
      return summaryFuture.and(sponsorEnrollerFuture).map { summary, sponsorEnrolled in
          print("summary: \(summary)")
          print("sponsorEnrolled: \(sponsorEnrolled)")
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 2013-06-29
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 2020-10-31
        • 2022-12-18
        • 2015-04-11
        • 1970-01-01
        相关资源
        最近更新 更多