2017-06-03 9 views
1

ブラウザで実行され、メインプログラムとウェブワーカーで構成されるscala.jsアプリケーションを検討してください。Web Workerの応答メッセージを先物にする方法は?

メインスレッドは、メソッドの名前とそれらを呼び出すために必要なパラメータを含むメッセージを渡して、Webワーカーに長期実行操作を委任します。ワーカーはメソッドの戻り値を応答メッセージの形式でメインスレッドに戻します。

簡単な言葉で言えば、このプログラムはWebワーカーメッセージングを抽象化しているため、メインスレッドのコードはイディオムで非同期のScala構文でワーカースレッドのメソッドを呼び出すことができます。

Webワーカーはメッセージを自分のレスポンスに何らかの形で関連付けないので、抽象化は各クロスコンテキストメソッド呼び出しを管理するレジストリ、つまり仲介オブジェクトに依存しています。このシングルトンはコールバック関数をバインドすることもできますが、コールバックの代わりに先物を使ってこれを実現する方法はありますか?

このレジストリでは、プログラマが標準的な非同期プログラミング構造Scala:futureと約束を使用するための抽象概念を構築するにはどうすればよいですか?

スケーラプログラマが標準的な方法でそれとやりとりできるように、この機能をどのように書くべきですか?例:

// long running method in the web worker 
val f: Future[String] = Registry.ultimateQuestion(42) // async 

f onSuccess { case q => println("The ultimate question is: " + q) } 

私は先物と約束事には新しいですが、いくつかの実行ブロックが終了すると通常完了するようです。この場合、Webワーカーからの応答を受け取ると、未来の完了を意味します。完了ステータスを外部プロセスに委譲するカスタム未来を書く方法はありますか? Webワーカーの応答メッセージを将来の状況にリンクする別の方法はありますか?

Can /未来の特性を拡張する必要がありますか?これはScala.jsで可能ですか?私が普及すべき具体的なクラスはありますか?既存の非同期Scala機能でこれらのクロスコンテキストWebワーカーメソッド呼び出しをカプセル化する他の方法はありますか?

ありがとうございました。

答えて

2

Hmm。ここではちょうど(まだ私は労働者を使用していない)が、あなたが働いているシングルスレッドのJavaScriptの世界では、要求を未来に関連付けるのがかなり簡単だと思われます。

ここに仮想設計があります。作業者に対する各要求/応答が自動的に封筒に包まれているとします。エンベロープにはRequestIdが含まれています。労働者は、MSGを処理

def sendRequest[R](msg:Message):Future[R] = { 
    val promise = Promise[R] 
    val id = nextRequestId() 
    val envelope = Envelope(id, msg) 
    register(id, promise) 
    sendToWorker(envelope) 
    promise.future 
} 

は別の封筒に結果をラップし、その結果がでメインスレッドに戻って処理されます:だから、送信側が(これは擬似コードが、本当っぽいです)のようになりますいくつかの充填で必要であり、Rなどの種類がどうあるべきかについていくつかの考えが、アウトラインのその種は、おそらくちゃんとうまくいくでしょう

def handleResult(resultEnv:Envelope):Unit = { 
    val promise = findRegistered(resultEnv.id) 
    val result = resultEnv.msg 
    promise.success(result) 
} 

:のようなもの。これがJVMの場合は、あらゆる種類の競合状態を心配する必要がありますが、シングルスレッドのJS世界では、要求IDに自動インクリメント整数を使用してPromiseを保存するのと同じくらい簡単かもしれません...

+0

ああ!だからプロミスはプログラマーが一種のセッターを呼んで約束が成就したときを決めることができるのですか?これがうまくいけば、私はこの質問の名前を「私は約束が何か分からない!ありがとう、ジャスティン!:) –

+0

正しい。プロミスと先物は基本的にはヒップで参加しています。プロミスを「プロデューサー」側とし、未来を「消費者側」と考えることができます。上記のパターンはPromiseを作成し、promise.futureを返します。実際に物事が完了したら、値のpromise.success()を呼び出すことは、「コールバック-y」APIを先物。 –

関連する問題