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?

4

1 回答 1

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

于 2013-08-29T01:25:09.757 回答