如何解决另一个承诺中的承诺?

时间:2013-08-29 00:39:39

标签: java asynchronous playframework-2.0

我有一项操作需要从远程服务器获取电子邮件列表。然后我想使用电子邮件从另一台远程服务器获取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

1 个答案:

答案 0 :(得分: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的处理程序中。