0

AsyncTwitterScalaアプリから使いたいです。慣用的な 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 の Future を使用した実装は次のようになります (例は 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 に答える