scala顺序贴子,用于理解而无需等待

scala顺序贴子,用于理解而无需等待,scala,post,for-loop,spray,Scala,Post,For Loop,Spray,我是scala新手,我使用spray向服务器发送请求。如果这个问题有点离题,请提前道歉。如果有人能告诉我如何做到这一点或我做错了什么,我将不胜感激。我想做的是: 发布请求并返回未来[HttpResponse] 不使用wait(因为我不想阻塞线程),检查响应代码 如果它的状态代码>400,则更改数据并重新发布数据并返回未来[HttpResponse],而不做任何进一步的操作 如果步骤2中的状态代码为良好,则返回步骤2中的未来[HttpResponse] 这就是我到目前为止所做的,如果状态代码是好的

我是scala新手,我使用spray向服务器发送请求。如果这个问题有点离题,请提前道歉。如果有人能告诉我如何做到这一点或我做错了什么,我将不胜感激。我想做的是:

  • 发布请求并返回未来[HttpResponse]
  • 不使用wait(因为我不想阻塞线程),检查响应代码
  • 如果它的状态代码>400,则更改数据并重新发布数据并返回未来[HttpResponse],而不做任何进一步的操作
  • 如果步骤2中的状态代码为良好,则返回步骤2中的未来[HttpResponse]
  • 这就是我到目前为止所做的,如果状态代码是好的,它似乎不会给我响应,但是它在服务器上完成了它的工作。如果我重试同一个请求,我会得到第一个显示的结果,即404,而我希望第一个返回404,第二个修复数据并重新发送请求,然后得到未来的响应

    def post(headers:HttpHeader, data:HttpEntity): Future[HttpResponse] = {
       ...
    }
    
    def secondPost(headers:HttpHeader, data:HttpEntity): Future[HttpResponse] = {
     // fix up  data and repost
     post(newHeaders, newData)
    }
    
    for{
      first <- post(headers, data)
      if first.status.intValue > 400
      second < secondPost(headers, data)
    } yield {
      if (first.status.intvalue > 400) second else first
    }
    
    def post(标题:HttpHeader,数据:HttpEntity):未来[HttpResponse]={
    ...
    }
    def secondPost(标题:HttpHeader,数据:HttpEntity):未来[HttpResponse]={
    //修复数据并重新发布
    post(新标题、新数据)
    }
    为了{
    前400名
    第二次<第二次发布(标题、数据)
    }屈服{
    如果(first.status.intvalue>400)second else first
    }
    
    非常感谢您的帮助。谢谢


    干杯

    你可以试着用平面地图

    post(headers, data) flatMap {
     case response     // first failed, try second requests
        if response.status.intValue > 400 => 
          secondPost(headers, data)
    
     case response => // first one was good, just return it
          Future.successfull(response)
    }
    

    嗨,尤金。像个迷人的伙伴一样工作:)谢谢