2013-08-29 62 views
1

我有一個操作,需要從遠程服務器獲取電子郵件列表。然後,我想使用電子郵件從另一個遠程服務器獲取emailDomainInformation的列表(請注意,第二條信息取決於第一條信息)。畢竟,我想要將來自兩臺服務器的數據輸出到地圖上,並將其呈現在帶有灰塵的頁面上。如何解決另一個承諾內的承諾?

我設法得到這個做像這樣沒有第二片數據的工作:

public static Result index() 
{ 
    F.Promise<Email> emailPromise = getEmailPromise(...); 
    F.Promise<Result> results = emailPromise.map(new F.Function<Email, Result>() 
    { 
    public Result apply(Email email) 
    { 
     Map<String, Object> data = new HashMap<String, Object>(); 
     data.put("email", email.getAddress()); 
     data.put("domain", email.getDomain()); 
     dustRenderer.render(data); 
    } 
    } 
    async(results); 
} 

現在,因爲我想打一個異步調用getEmailDomainData(email.getDomain());emailPromise.map()方法內。我該如何處理Promise<EmailDomain>對象?我怎麼把這個放到data地圖中去傳遞給dustRenderer

回答

2

下面是一個例子,基本上做了你需要的東西:

public static Result social() { 
    final F.Promise<WS.Response> twitterPromise = WS.url("http://search.twitter.com/search.json").setQueryParameter("q", "playframework").get(); 
    final F.Promise<WS.Response> githubPromise = WS.url("https://api.github.com/legacy/repos/search/playframework").get(); 

    return async(
      twitterPromise.flatMap(
        new F.Function<WS.Response, F.Promise<Result>>() { 
         public F.Promise<Result> apply(final WS.Response twitterResponse) { 
          return githubPromise.map(
            new F.Function<WS.Response, Result>() { 
             public Result apply(final WS.Response githubResponse) { 
              return ok(views.html.social.render(twitterResponse.asJson().findValuesAsText("text"), githubResponse.asJson().findValuesAsText("name"))); 
             } 
            } 
          ); 
         } 
        } 
      ) 
    ); 
} 

在這種情況下,在兩個並聯運行,但你可以移動第二Promise創作進入處理程序第一Promise

+0

這是有幫助的。我的問題是第二個請求取決於第一個請求的結果,但我最終還需要返回第一個和第二個請求。我最終做的是:在第一個請求的處理程序中設置第二個請求。然後做第一個請求和第二個請求的平面圖,並在該處理程序中將第二個請求附加到第一個請求上,然後將第一個請求作爲對象返回。然後在我的控制器中,我可以調用第一個請求的getSecondRequest()getter來獲取第二個請求。 –