2016/12/02

[勉]Meteor? 非同期?

急きょ、お仕事でほんのちょっとだけ触ることになりそうなmeteorのことを調べておこう。
「めてお」と発音するようだ。
どうしても、CodeSourceryのMentor社が頭をよぎってしまう。。。

 

https://www.meteor.com/

ブラウザで見るサイトを作るときにはだいたいJavaScriptを使うが、そういうアプリを作るためのフレームワークらしい。
・・・済まん、この世界のことが分かっていないので、用語が正しいかすらわからん。

 

私がJavaScriptを使ったときは、動的なHTML画面を作る、という場合だけだった。
定期的に監視して、値が変わったら更新する、とか。
だから、クライアント側で動くJavaScriptと呼ぶことができるだろう。

Meteorの紹介を読むと、サーバサイドもクライアントサイドも両方書ける、というところが利点としてあげられていた。
むかーし、JavaScriptが導入されたときは、サーバで処理するとクライアント数に応じて負荷がかかるから、できることはクライアント側でやってあげましょう、みたいな話を聞いていた。
時代は変わったのね。

 

ともかく、このmeteorというのをインストールして、決まった場所にHTMLやらJavaScriptやらのファイルを置いておくと、自動的に閲覧用の構成を作ってくれるらしい。
ちょっと試したところでは、特にApacheなどもインストールしていないのに3000番ポートにブラウザでアクセスできた。

 

私は一から環境を作るわけでも、サイトを作るわけでもなく、気分転換したいときにサイトを見て不具合があったら修正してくれると助かる、という程度なのだ。
だから、それほど真面目に調べたいわけではない。


で、その不具合の1つで聞いているのが、値が非同期で返ってくる処理結果を画面に反映させる処理をまだ書いていない、というやつだった。
あまり分かってないが、JavaScript側に関数を書いておき、そのreturnで戻ってきた値をHTML側で{{value}}みたいな感じで参照することができるようなのだが、処理が非同期なのでreturn時には値がまだない、ということのようだ。

以前、結果が動的に変わる画面書いたときは、setInterval()とかで定期的に結果を監視して、画面表示が変更になりそうだったらelementなんとかに代入して更新させていたように思う。
今回の箇所はコールバックで結果が戻ってくるようだから、そのタイミングで同じようなことをやるのだろうか。

Meteorの説明を読むと、非同期のところを同期にすることでさっぱりさせた、という項目があった。
ならば、JavaScriptでなんとかするんじゃなくて、Meteorのしくみを使ってなんとかするのだろうか?

こういうフレームワークを使うと、解決するのにフレームワークでのやり方があるのか、一般的なやり方でよいのか、そこの見極めが難しいことがあるよなぁ。

 

ざっと検索すると、サーバ側に書いた処理が非同期だった場合のやり方が出てきた。
ただ、今回は、たぶんだけど、非同期なのはサーバ側の処理ではなさそうな気がしている。

Promiseというのを使う例も出てくるが、async/awaitをPromiseの代わりに使うという記事もあった。
Async.wrap()というのはサーバ側だけらしい。

なんとなく、Promiseというのはコールバックを連結して処理を行うようにするのを避けるためのやり方で、コールバックで得られた結果を画面反映させたいというのとはちょっと違うような気もする。

もしクライアント側だけで非同期だったとしても、それをサーバ側に持っていけば、サーバ側なら同期で返す方法があるらしいので、それで済ませてしまうものなのだろうか。。。

だいたい、非同期で処理するということはコンテキストが別になるということだから、コールバックされたコンテキストは関数で呼ばれたときと異なると思うのだ。
Linuxとかだとselect()で待たせる、みたいなやり方があるけど、関数が呼ばれた経路はHTMLのメインスレッドに相当するはずだから、returnせずにコールバックを待たせるとブラウザが固まってしまうんじゃないかと思う。

 

よくやりたいことのような気がするので、探し方が悪い気がしている。。。

→続き記事

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。