2015-10-08 44 views
0

我從一個node.js視角圍繞Akka環繞我的頭。我在下面執行以下node.js代碼,並且很容易編寫&。我可以輕鬆擴展以處理和聚合多個異步服務,同時保留初始參數狀態數據(示例中爲a)。Node.js編程風格與Akka

function handleAction(a, b, callback) { 
    remoteServiceOperation(b, function(err, data) { 
     if (!err) { 
      // I can reference argument a 
      z = a + data; // Do work with a and service result 
     } 
    }); 
} 

以下是Akka/Scala的粗略僞指令。我的理解是要求?塊,應該避免一般。試圖說明我的知識列表在哪裏結束,以及我不清楚如何持有狀態a,聚合(未顯示),或者可能通常以node.js樣式結構Akka。

receive { 
    case handleAction(a) => 
     remoteService ! new RemoteServiceOperation(b, c) 
     // About to leave and we'll loose `a` 
    case remoteServiceOperationResponse(data) => 
     // `a` is afk 
} 

我怎樣才能更像節點寫阿卡?

+0

'?'不是阻塞操作。我認爲你可能會對接收函數的工作原理感到困惑 - 它只是Scala模式匹配,編寫'case handleAction(a)'實際上不會調用一個名爲'handleAction'的函數。 – Ryan

+0

謝謝,[Akka Futures](http://doc.akka.io/docs/akka/snapshot/scala/futures.html#futures-scala)澄清了您關於阻止的要點。使用'?'似乎不是解決問題的唯一方法。 – fionbio

回答

2

我想你的回調在nodejs中的編程風格比在Actor中使用Future更好。

它看起來像這樣:

val service1Res: Future[Int] = service1() 
val service2Res: Future[Int] = service2() 

for { 
    i <- service1Res 
    j <- service2Res 
} yield i+j + 2 

很多人說,演員們用最好的保持狀態和期貨這樣的事情。當用演員建模時,你會遇到的問題是你需要定義的消息爆炸以傳達這些演員。

如果你真的需要或想要使用演員,當你有這個handleAction消息產生一個新的演員,將完成工作,並將獲得在c-tor a。這個額外的好處你將有很好的監督什麼可能是阿卡最不常用的選項,同時也是最有價值的。