一步步實現Promise

最近在https://github.com/ThoughtWorksInc/rest-rpc上工做,遇到了一個scala隱式轉換的問題,簡單的說是要實現這麼個東西:css

implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = ???

把一種類型的Future(com.qifun.jsonStream.rpc.IFuture1)轉換成爲另外一種類型的Future(scala.concurrent.Future)。git

其中第一種Future的定義以下:github

public interface IFuture1<AwaitResult> {
    void start(ICompleteHandler1<AwaitResult> var1);
}

而ICompleteHandler1的定義爲:json

public interface ICompleteHandler1<AwaitResult> {
    void onSuccess(AwaitResult var1);

    void onFailure(Object var1);
}

彼時對Future和Promise的概念尚未太好的理解,因此把一個將來變換成爲另外一個將來這種虛無縹緲的東西仍是有點想象不來。因而嘗試手工實現,ide

初版的想法是觸發jsonStreamFuture的start方法,傳給它一個ICompleteHandler1的實現,而後等到onSuccess方法獲得調用的時候,把var1這個結果保存到jsonStreamFutureToScalaFuture這個函數的局部變量中(給其命名爲acceptVar吧)。而後再定義一個Future,在Future的實現中不斷的檢查acceptVar是否有值了,若是有了則返回。這種樸素的想法寫出來就是這樣:函數

implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = {
  var acceptVar:Any = None

  jsonStreamFuture.start(new ICompleteHandler1[Value] {
    override def onSuccess(value: Value): Unit = acceptVar = value
    override def onFailure(ex: scala.Any): Unit = ???
  })

  new Future {
    def onSuccess[U](pf: PartialFunction[Value, Unit]): Unit = {
     while (acceptVar == None) {
     }
     pf(acceptVar.asInstanceOf[Value])
   }
  }
}

固然這是編譯不過的。。。this

但即便可以編過,這種while循環的方式也是醜陋的沒法接受的。因此開始探索更好的方式,既然在ICompleteHandler1的onSuccss函數中可以獲得value,那主動去觸發將要返回的那個Future實例內保存的onSuccess的回調如何?想讓強類型的語言編譯經過比較費勁,因此下面的代碼還只是用來demo想法的:spa

implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = {
  var future = new Future(
    var successCallBack;
    def onSuccess(success: Success): Unit = {
      this.successCallBack = success;
    }
  )

  jsonStreamFuture.start(new ICompleteHandler1[Value] {
    override def onSuccess(value: Value): Unit = future.successCallBack(value)
    override def onFailure(ex: scala.Any): Unit = ???
  })
  future
}

因此當我最後使用Promise來解決相似問題的示例代碼時候,我就意識到其思想和上述的第二種方法是相似的,寫出來是這樣的:scala

implicit def jsonStreamFutureToScalaFuture[Value](jsonStreamFuture: IFuture1[Value]):Future[Value] = {
  val p = Promise[Value]()

  jsonStreamFuture.start(new ICompleteHandler1[Value] {
    override def onSuccess(value: Value): Unit = p success value
    override def onFailure(ex: scala.Any): Unit = p failure ex.asInstanceOf[Throwable]
  })

  p.future
}

好吧,其實本文並無本身實現一個Promise,不過經過這種從新構造現有概念的方式(固然也是由於本身的無知- -)確實可以幫助對現有概念的理解。rest

相關文章
相關標籤/搜索