0

我想AsyncTwitter从我的 Scala 应用程序中使用。有没有办法将它包装在期货中,让它看起来更像是惯用的 Scala?或者期货真的可以将同步的东西转换为异步的(即,对已经异步的函数没有用)?

无论哪种方式,在 Scala 中进行异步 twitter 状态更新的最惯用的方式是什么

  1. 将代码包装AsyncTwitter在期货中?
  2. 将来包装同步代码?
  3. 忘记期货,只需在 Scala 中重写下面的代码。

并且(特别是如果#1 是答案)最终代码会是什么样子?

这是我想知道的代码:http: //twitter4j.org/en/code-examples.html#asyncAPI

TwitterListener listener = new TwitterAdapter() {
    @Override public void updatedStatus(Status status) {
      System.out.println("Successfully updated the status to [" +
               status.getText() + "].");
    }

    @Override public void onException(TwitterException e, int method) {
      if (method == TwitterMethods.UPDATE_STATUS) {
        e.printStackTrace();
      } else {
        throw new AssertionError("Should not happen");
      }
    }
}
// The factory instance is re-useable and thread safe.
AsyncTwitterFactory factory = new AsyncTwitterFactory(listenrer);
AsyncTwitter asyncTwitter = factory.getInstance();
asyncTwitter.updateStatus(args[0]);

我猜#2 不是答案,因为那样你仍然被挂起的同步线程的开销所困扰,对吧?

4

1 回答 1

1

使用 Scala 的 Futures 的实现看起来像这样(示例是 getDirectMessages):

class DirectMessageListener extends TwitterAdapter {

  val promise = Promise[Seq[DirectMessage]]()


  override def gotDirectMessages(messages: ResponseList[DirectMessage]) {
    promise.success(messages)
  }

  override def onException(te: TwitterException, method: TwitterMethod) {
    promise.failure(te)
  }
}

class TwitterClient(twitter: Twitter) {

  val factory = new AsyncTwitterFactory()

  def getDirectMessage(): Future[Seq[DirectMessage]] = {
    val listener = new DirectMessageListener
    val asyncTwitter = factory.getInstance(twitter)
    asyncTwitter.addListener(listener)
    asyncTwitter.getDirectMessages()
    listener.promise.future
  }

}

用法:

val client = new TwitterClient(???)  
client.getDirectMessage() onComplete (_.foreach(println))
于 2013-02-07T23:18:09.190 回答