【node.js】サーバサイドjavascript 3【io.js】©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
2014/12/27(土) 18:40:07.70ID:MwQYLNURサーバサイドjavascriptについて語りましょう。
node.js - googleが開発したV8エンジン上で実行できる処理系
http://nodejs.org/
io.js - node.js 互換で Joyent の影響からの脱却を目指す処理系
http://iojs.org/
Rhino - JVM上で実行できる処理系
https://developer.mozilla.org/ja/Rhino
io.js の経緯
http://stackoverflow.com/questions/27309412/what-is-the-difference-between-node-js-and-io-js
javascriptはrubyと比較してもかなり速い
http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=v8&lang2=yarv
基礎から学ぶNode.js
http://gihyo.jp/dev/serial/01/nodejs
node.jsの概要とアプリケーション開発の準備
http://gihyo.jp/dev/serial/01/realtimeweb/0002
前スレ
【node.js】サーバサイドjavascript 2【Rhino】
http://peace.2ch.net/test/read.cgi/tech/1358937029/
【node.js】サーバサイドjavascript【Rhino】
http://toro.2ch.net/test/read.cgi/tech/1310087535/
0002デフォルトの名無しさん
2014/12/27(土) 18:40:56.41ID:MwQYLNUR0003デフォルトの名無しさん
2014/12/27(土) 18:42:30.42ID:Cc0RXd7d0004デフォルトの名無しさん
2014/12/27(土) 22:58:41.76ID:2nBgrTKt0005デフォルトの名無しさん
2014/12/27(土) 23:02:11.92ID:+XmnrNOH流行ってた
0006デフォルトの名無しさん
2014/12/31(水) 18:23:54.12ID:ySiWi1AV0007デフォルトの名無しさん
2014/12/31(水) 19:45:43.48ID:qeTCZCBAOKなら、今どっち採用するか凄く迷ってるんですけど
0008デフォルトの名無しさん
2015/01/01(木) 16:37:51.69ID:PtOebUlaと安易に寄ってきたにわかがイベントドリブン周りが頭に入らなくてすごすご退散するケースが多そう
0009デフォルトの名無しさん
2015/01/02(金) 00:11:15.27ID:8He3Adur俺はそれに近い
0010デフォルトの名無しさん
2015/01/02(金) 00:20:31.87ID:mlj15zVW0011デフォルトの名無しさん
2015/01/02(金) 00:22:52.63ID:1zRkX7fJ自己紹介乙
0012デフォルトの名無しさん
2015/01/02(金) 00:54:28.10ID:buPBY5a2って以外のメリットって何かあるの?
0013デフォルトの名無しさん
2015/01/02(金) 14:54:02.14ID:mlj15zVW綺麗っていうのが曖昧な表現だがおおむね以下のメリットがある
・コールバック関数から更にコールバックを呼ぶ時にネストが深くなるのを防げる
(ソースが三角形になるのを防げる)
・A,B,Cの内ABが終わっててかつCが終了した直後に処理を開始するとかの制御が簡単になる
(つうか自前でやろうとするとかなり面倒な事になる)
・エラー処理を一纏めにしたりなんかの制御が簡単になる
これを綺麗に書けるの一言でくくってしまったら他のメリットは無い
0014デフォルトの名無しさん
2015/01/02(金) 16:32:56.94ID:buPBY5a2レスさんくす。
>>8 に対しては、むしろコールバック関数を使ったやり方のほうが
node.jsの動作を理解できていいんじゃないかと思ったのでね。
0015デフォルトの名無しさん
2015/01/03(土) 11:31:09.56ID:duDbuP4G漏れはチベット国旗みたいになる
0016デフォルトの名無しさん
2015/01/03(土) 22:51:09.22ID:Uo8+VTLN「Promiseを理解しないと非同期のメリットを生かせない」ってのは
表層しか理解してないって証だわな
Promiseと非同期をjQueryとDOMにでも置き換えて考えてみるといい
0017デフォルトの名無しさん
2015/01/03(土) 23:38:28.29ID:AuGuhWCh実際生かせないだろ
> ・A,B,Cの内ABが終わっててかつCが終了した直後に処理を開始するとかの制御が簡単になる
非同期処理をやってると↑こういう事がしょっちゅうあるけど、どうやって自前でやんの?
単にフラグだらけの糞みたいなソースが出来るだけだ
0018デフォルトの名無しさん
2015/01/04(日) 00:06:14.65ID:NffMCEWR実際はそんなもん自前で書かずにasync使ってたけどな
ECMA標準だから仕事じゃPromise使ってくけどそんなのは所詮表層の話に過ぎないよ
PromiseよりStreamが適することも多いし
0019デフォルトの名無しさん
2015/01/04(日) 00:10:50.21ID:kuXg+7pGどうせマルチスレッドvs非同期処理の事いってんだろ
そんな事言ってんじゃねーんだよ
スレの流れも読まずに何一人でブチ切れてんだよアホか
0020デフォルトの名無しさん
2015/01/04(日) 00:18:39.72ID:LcMrfHes一方俺は、asyncもどきを自前で作った。(趣味でだけど)
非同期処理の中でさらに非同期処理をして、それぞれの終了時に指定された関数を呼び出す
可能性があるようなプログラムだったんで、途中頭がこんがらがったけど何とかできたわ。
0021デフォルトの名無しさん
2015/01/04(日) 00:26:18.12ID:kuXg+7pG一応だけど、ブラウザ内蔵のPromiseはJavaScriptで実装出来ない事をしてるから
Promise使った方がいいとは思うよ
・渡されたコールバックを確実に非同期で実行する
・飲み込まれた例外をデバッグ出来る
ってのがそう
0022デフォルトの名無しさん
2015/01/04(日) 00:35:28.28ID:NffMCEWRどこを誤読するとそうなるんだよwww
並列ってのはPromise.all()やasyncのparallel()のような処理フローのこと
逐次ってのはPromiseのthen()によるチェーンやasyncのseries()・waterfall()のような処理フローのこと
俺の方はスレの流れを読めてると思うぞ
002320
2015/01/04(日) 00:38:56.49ID:LcMrfHesブラウザのJavascriptもシングルスレッドじゃなかったっけ?
であれば、
・渡されたコールバックを確実に非同期で実行する
・飲み込まれた例外をデバッグ出来る
はPromise使わなくてもできるよ。使った方が楽だろうけど。
0024デフォルトの名無しさん
2015/01/04(日) 00:53:04.50ID:kuXg+7pG> ・渡されたコールバックを確実に非同期で実行する
これはsetTimeout使ったハックがあってほぼ確実なのは可能だけど、
絶対確実な実装はブラウザが内部で実装しないと無理なんだよね
> ・飲み込まれた例外をデバッグ出来る
そりゃ、ライブラリ内部のcatch内にブレークポイントを張って待ちかまえていれば
可能だが毎回そんな事すんのか?いやするわけない
そして例外がスルーされて何も起きない
0025デフォルトの名無しさん
2015/01/04(日) 00:54:44.21ID:NffMCEWRサーバサイドJSスレで「ブラウザ内蔵のPromise」ってw
そこはv8のPromise実装って書けよ
>>22
QとかBlurbirdはそれらをJSで実装してるわけだからな
どうしてJSで実装できないと思い込んだのか謎だ
0026デフォルトの名無しさん
2015/01/04(日) 00:56:26.84ID:NffMCEWRあとBlurbirdじゃなくてBluebird
0027デフォルトの名無しさん
2015/01/04(日) 01:03:40.55ID:kuXg+7pGブラウザ内蔵って…ごめんちゃい
QとかBlurbirdはほぼ確実な実装でお茶を濁してる (実用上問題ないけど)
例外の件は>>24の通りだ
0028デフォルトの名無しさん
2015/01/04(日) 01:21:16.51ID:NffMCEWR「お茶を濁してる」について詳しく
nodeではprocess.nextTick()かsetImmediate()で確実に非同期にできるが?
v8のPromiseだってマイクロタスクキューに入れられて結局はnodeのイベントループで処理されるのは同じ
例外のデバッグって具体的には?
Promise.catch()にブレークポイント付けれるって話?(それはブラウザ関係ないと思うが…?)
もしそうならライブラリがcatchした例外はコールバックの第1引数に渡されるのがnodeの流儀で同じようにできるが?
0029デフォルトの名無しさん
2015/01/04(日) 01:41:12.11ID:NffMCEWR0030デフォルトの名無しさん
2015/01/04(日) 01:57:43.71ID:kuXg+7pG> nodeではprocess.nextTick()かsetImmediate()で確実に非同期にできるが?
Qとかはnode用やIE用じゃないが、場合分けしてる可能性はある
> v8のPromiseだってマイクロタスクキューに入れられて結局はnodeのイベントループで処理されるのは同じ
それがJavaScriptで実装出来ない事をしてることじゃなくて?
> 例外のデバッグって具体的には?
説明が面倒になってきた…
Promiseに限った話しじゃないが、ライブラリ内でtry,catchしちゃってると
呼び出し側に例外が来ないって事だ (当たり前の事だけど)
で、Promiseの場合は呼び出し側がエラー処理もしてない場合でも、
デバッガが気を効かせて例外を上げてくれるってだけだ
ま、薄々感づいてると思うが、俺はずっとブラウザ実装の事を言っていた…
しかしPromiseが満たすべき一般的な動作仕様を言ってるつもりではある
0031デフォルトの名無しさん
2015/01/04(日) 02:35:21.46ID:NffMCEWR> それがJavaScriptで実装出来ない事をしてることじゃなくて?
nodeではv8のマイクロタスクキューもsetImmediate()もnodeのイベントループで処理されるのは同じって意味な
つまりJSのsetImmediate()でコールバックを確実に非同期にできるってこと
これはブラウザでも同じはずだ
違うなら「ブラウザが内部で実装しないと無理」な理由を具体的に書いてくれ
> 呼び出し側に例外が来ないって事だ (当たり前の事だけど)
ライブラリの実装依存ではあるが、nodeでは当たり前じゃない
nodeでは例外を第1引数としてコールバックすることで呼び出し側に例外を伝えるのが流儀だ
だからPromiseでnodeのAPIやライブラリをラップしてもPromise.catch()に例外が渡る
(ラッパーはコールバックの第1引数に例外が渡されたらPromise.reject()を呼び出す)
>>21を見てから薄々じゃなく確信していた
0032デフォルトの名無しさん
2015/01/04(日) 02:54:15.95ID:kuXg+7pG> 違うなら「ブラウザが内部で実装しないと無理」な理由を具体的に書いてくれ
setImmediate()がコールバックを確実に非同期に出来るっていう仕様ではないだろ
確実に非同期って意味は
setImmediate(function callback() {
});
a += 1;みたいななんらかの処理 ←これが実行される前にcallbackが絶対実行されない
ことを保証してんの?
そもそも非標準のAPIなんだけど…
> ライブラリの実装依存ではあるが、nodeでは当たり前じゃない
QとかBluebirdみたいに自前で実装すると例外が飲まれるって話しじゃなかったのか…
Promiseの実装を熱弁してるけど、とりあえずそういう事でいいよ
0033デフォルトの名無しさん
2015/01/04(日) 03:42:19.87ID:NffMCEWR> これが実行される前にcallbackが絶対実行されない
ことを保証してんの?
仕様はそうなってる
https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/setImmediate/Overview.html
> そもそも非標準のAPIなんだけど…
そこはこのNotesに書いてある"platform code"から好きなものに置き換えてくれ
https://github.com/promises-aplus/promises-spec
> QとかBluebirdみたいに自前で実装すると例外が飲まれるって話しじゃなかったのか…
>>23(これは俺とは別人)からは「それPromise使わなくてもできるよ」って話をしてるな
それは当然JSで書かれたQやBluebirdでもできるってことだから元の話と違ってるわけではない、スコープが広がっただけ
で、QとかBluebirdだと例外が飲み込まれるわけ?コードで示せる?
0034デフォルトの名無しさん
2015/01/04(日) 04:38:34.06ID:kuXg+7pG> 仕様はそうなってる
Schedules to run handler immediately after user agent events have been flushed.
user agent eventsってなんだ?
a += 1;の実行が終わってからとは言ってないと思うが
> そこはこのNotesに書いてある"platform code"から好きなものに置き換えてくれ
置き換えて何だよ?
platform code(要するにJavaScriptでないコード)を実行しろとわざわざ書いてる
> 違うなら「ブラウザが内部で実装しないと無理」な理由を具体的に書いてくれ
元の質問は↑これ、お前は論点をずらそうとしてるだけだな
> で、QとかBluebirdだと例外が飲み込まれるわけ?コードで示せる?
お前眠いのかw
俺はもうもちそうもないが
>>30の下の方で言ってるよ
0035デフォルトの名無しさん
2015/01/04(日) 14:15:40.27ID:DzK37a2Vもし1995年にnode.jsがあったら
0036デフォルトの名無しさん
2015/01/04(日) 14:59:18.44ID:x8qIKDC60037デフォルトの名無しさん
2015/01/04(日) 16:12:14.10ID:HFKhuxk5綺麗なコード書けない時点で人気出ないだろうね
0038デフォルトの名無しさん
2015/01/04(日) 16:24:29.87ID:l0Z2uGSM0039デフォルトの名無しさん
2015/01/04(日) 16:39:24.09ID:w2TCoU2vそいつがアホなだけ
0040デフォルトの名無しさん
2015/01/04(日) 16:44:05.85ID:CtgO5+tKネタニマジレスカコワルイ
0041デフォルトの名無しさん
2015/01/04(日) 16:57:31.37ID:2KBXdzj3CD-ROMドライブが標準でついてるというのに(TOWNSユーザー並の感想
0042デフォルトの名無しさん
2015/01/04(日) 17:40:22.84ID:NffMCEWR技術的に難しい話はしてないが、こういう場で会話を成立させるのは難しいなw
できれば誰か ID:kuXg+7pG の主張を翻訳して欲しい
0043デフォルトの名無しさん
2015/01/04(日) 18:06:08.86ID:NffMCEWR> a += 1;の実行が終わってからとは言ってないと思うが
"5 Processing Model"の4に、5以降は非同期に実行すると書いてある
> 置き換えて何だよ?
お前が使ってるブラウザに合わせて読み替えろというだけだ
サーバサイドJSスレとしてはnodeで使えるprocess.nextTick()やsetImmediate()で何の問題もない
> platform code(要するにJavaScriptでないコード)を実行しろとわざわざ書いてる
"paltform code"はプラットフォームごとに異なるコードという意味で
それがJSで実装されてようがされてまいがどうでもいい
実のところnodeのsetImmediate()はJSで実装されている
https://github.com/joyent/node/blob/v0.10/lib/timers.js#L361
> > 違うなら「ブラウザが内部で実装しないと無理」な理由を具体的に書いてくれ
> 元の質問は↑これ、お前は論点をずらそうとしてるだけだな
いみふ
「ブラウザが内部で実装しないと無理」の対象はPromiseそのものの実装だ
Promiseの実装が呼び出すAPIの話じゃない
「stringはブラウザで実装されている」を理由に「stringを使うのはブラウザが内部で実装しないと無理」っておかしいだろ?
"platform code"がブラウザやnodeで実装されていても、それを使うコードはJSで書ける
たとえばQはこの辺で"platform code"を呼び分けてる (モダンブラウザだとpostMessage()が使われてるな)
https://github.com/kriskowal/q/blob/v1/q.js#L160
これは「ブラウザが内部で実装しないと無理」ではなく普通のJSのコードだ
0044デフォルトの名無しさん
2015/01/04(日) 18:08:08.79ID:NffMCEWR> >>30の下の方で言ってるよ
話がループしてるな… その>>30の以下について
> Promiseに限った話しじゃないが、ライブラリ内でtry,catchしちゃってると
> 呼び出し側に例外が来ないって事だ (当たり前の事だけど)
これはPromiseを実装するQのようなライブラリ側の話だよな?
ライブラリ側がcatchした例外を飲み込んで捨てた場合は確かにそうだが、
QやBluebirdは飲み込まずにPromise.catch()に通知するだろ
Promiseを使わない場合でもnodeの流儀ならコールバックの第1引数で通知する
だからこれは「ブラウザ内蔵のPromiseはJavaScriptで実装出来ない事をしてる」に該当しない
っていうのが>>31で書いたことだ
それに対して>>32で
> QとかBluebirdみたいに自前で実装すると例外が飲まれるって話しじゃなかったのか…
と返されたわけだが、前述の通り飲み込まずにPromise.catch()で通知されるはずだから
そうじゃないっていうなら
> で、QとかBluebirdだと例外が飲み込まれるわけ?コードで示せる?
と>>33で尋ねたわけだ
その返事が>>34の「>>30の下の方で言ってるよ」だと完全にループ
まずは確認だが、
・QとかBluebirdでは例外が飲まれる
って主張してるんだよな?
それならどういうケースでそうなるのか例を示してくれ
Promise.catch()に伝わらないケースがもしあるなら、おそらくそれはただのバグだ
0045デフォルトの名無しさん
2015/01/04(日) 19:14:35.42ID:w9Cj0tkO0046デフォルトの名無しさん
2015/01/04(日) 19:32:10.48ID:zyY9pL0A0047デフォルトの名無しさん
2015/01/04(日) 20:18:20.57ID:w9Cj0tkOどうもありがとうございます
004823
2015/01/04(日) 20:31:31.22ID:LcMrfHes>Schedules to run handler immediately after user agent events have been flushed.
>user agent eventsってなんだ?
ここで言っているuser agent eventsはHTML要素のon〜属性に指定したイベントハンドラ関数みたいだね。
1章のIntroductionで「user agent eventsの中で画面を書き換えるような処理を書いて、
その後の処理を行う前にその変更を画面に反映させたいときに、今まではsetTimeout(fn,0)を
使ってただろうけど、それだと遅延が発生するからsetImmediateてメソッドを定義するよ」
ってな感じのことが書いてある。
>> そこはこのNotesに書いてある"platform code"から好きなものに置き換えてくれ
>置き換えて何だよ?
Notes の記述に、
This can be implemented with either a "macro-task" mechanism such as setTimeout or setImmediate,
or with a "micro-task" mechanism such as MutationObserver or process.nextTick.
「これは、setTimeout,やsetImmediate (”マクロタスク”機構)、またはMutationObserverやprocess.nextTick
("マイクロタスク"機構)を使っても実装できるよ」
って書いてあるね。この中のどれを使って置き換えても実現できるということだね。
例外処理についても>>44の通りで、それ以上に言うべきことはないかな。
ただデバッガとかブレークポイントとかの言葉が出ていたから、
必要以上に難しく考えていたんじゃないかという気がしないでもない。
004923
2015/01/04(日) 20:43:54.20ID:LcMrfHes>たとえばQはこの辺で"platform code"を呼び分けてる (モダンブラウザだとpostMessage()が使われてるな)
MessageChannel 知らんかった。。。
node.js では process.nextTick、ブラウザでは setTimeout と使い分けるだけだったよ。
勉強になった、サンクス。
0050デフォルトの名無しさん
2015/01/04(日) 20:59:25.50ID:CtgO5+tK> Promiseを使わない場合でもnodeの流儀ならコールバックの第1引数で通知する
通知しても呼び出し側がハンドリングしてなきゃ意味ないだろ
別にハンドリングしたきゃrejectjをハンドリングすりゃいいんだよ、アホか
まったくハンドリングしてない予期しない例外でも内蔵Promiseならデバッガが
気を効かせて例外を通知してくれるって事を言ってんのに
お前はなんで分かんないんだよマジで無能だな
0051デフォルトの名無しさん
2015/01/04(日) 21:02:03.05ID:CtgO5+tKお前がPromise使ってプログラムなんかした事ないド素人なのは分かったよ
じゃなきゃ、そんな事言う訳ないし
普通はそうだね、で終わる話しを、ドアホのお前がバカみたいに突っこんでるだけなのを
オレが暇だから相手してるだけだよ
0052デフォルトの名無しさん
2015/01/04(日) 22:08:03.31ID:NffMCEWRまず
> ・渡されたコールバックを確実に非同期で実行する
これがJSで実装できないって主張は間違いだったということでいいのか?
次に
> ・飲み込まれた例外をデバッグ出来る
「まったくハンドリングしてない予期しない例外」をデバッグできるのは内蔵Promise関係なく
JS処理系(Chromeならv8)のデバッガの機能だろ
nodeでもv8のデバッガは有効だからnode debug x.jsで実行してbreakOnExceptionしておけば
「まったくハンドリングしてない予期しない例外」でブレークする
nodeはprocess.on('uncaughtException')があるからそれでデバッガ使う機会は少ないけどな
だがこの話マジでPromise関係なくね?
つか「ハンドリングしてない例外」でなく「ハンドリングしてないreject (uncaught promise rejections)」
のデバッグを言ってるのか?
だとすると全然話が違うが、debugger文を使えば内蔵Promiseじゃなくても実装はできるな
> お前はなんで分かんないんだよマジで無能だな
お前以外誰もお前の言ってることを理解できてないんじゃないか?w
できてる人がいるならマジで翻訳してくれ
あと俺はECMA入り前を含めると2012年頃からPromise使ってる
ただしnodeでの話だからブラウザ固有の話は知らない可能性は高い
ここはサーバサイドJSスレなんだからその辺はお前の方が考慮してくれ
0053デフォルトの名無しさん
2015/01/04(日) 22:36:38.77ID:NffMCEWRこういうコード(x.js)があるとするじゃろ
process.nextTick(function() {
throw new Error('unhandle');
});
こうやって実行するじゃろ
$ node debug x.js
< Debugger listening on port 5858
connecting to port 5858... ok
break in x.js:1
> 1 process.nextTick(function() {
2 throw new Error('unhandle');
3 });
1行目で止まってるからおまじないを唱えるじゃろ
debug> breakOnException
実行再開するじゃろ
debug> c
exception in x.js:2
Error: unhandle
1 process.nextTick(function() {
> 2 throw new Error('unhandle');
3 });
debug>
ハンドルされてない例外のせいで2行目で止まったじゃろ
0054デフォルトの名無しさん
2015/01/04(日) 23:45:19.91ID:NffMCEWR最新のブラウザではサポートされてるのか?
たとえば
Promise.resolve(true).then(function(v) {
throw new Error('then');
}).catch(function(e) {
console.log(e);
});
と最後にcatch()すべきところを忘れてしまって
Promise.resolve(true).then(function(v) {
throw new Error('then');
});
とした場合、これをChrome安定版(39)で実行してもブレークしない
スローした例外は内蔵Promiseの実装でcatchしてるからv8から見ると
ハンドルされてるって扱いなんだろう
Chrome開発版や他のブラウザだとブレークするのか?
0055デフォルトの名無しさん
2015/01/05(月) 09:46:01.36ID:mZODWVt6横から失礼、俺も読んでて意味わからないから質問させてくれ
>まったくハンドリングしてない予期しない例外でも内蔵Promiseならデバッガが
>気を効かせて例外を通知してくれるって事を言ってんのに
>お前はなんで分かんないんだよマジで無能だな
内臓Promiseの利点はデバッガが気を利かせて例外通知をしてくれる、と読めるんだけど、つまり製品に使うと勝手にデバッガが動いてる状態になるから開発時以外は使っちゃいけないって事でOK?
それともPromiseには何らかのデバッガが内臓されている感じなのかな?もしそうだとして、デバッガが動作してることを前提でコードを組むのがPromiseの使い方って事?
もし前者なら(特に将来的に)仕様がどうなるかは環境依存って事になるから、Promiseは使ってはいけないんじゃないだろうか?
0056デフォルトの名無しさん
2015/01/05(月) 12:38:50.48ID:A9O4oHD7>>52
> > ・渡されたコールバックを確実に非同期で実行する
>
> これがJSで実装できないって主張は間違いだったということでいいのか?
setImmediate()の仕様は、渡されたコールバックを次のJavaScriptの命令が確実に実行された後に
実行するとは読めなかったが、もし内部の実装がそうなってるのであれば、setImmediate()で
実装できるよ
ただし、本当に内部の実装がそうなってるかどうかはお前が確認して報告しろ
> Chrome開発版や他のブラウザだとブレークするのか?
通常のChromeとFirefoxでブレークするのを確認した
>>55
> つまり製品に使うと勝手にデバッガが動いてる状態になるから開発時以外は使っちゃいけないって事でOK?
デバッガは普通のブラウジング時には有効になってないよ
有効にするにはブラウザごとにやり方が違うから自分で調べてくれ
0057デフォルトの名無しさん
2015/01/05(月) 20:40:46.70ID:xBMPeqox> ただし、本当に内部の実装がそうなってるかどうかはお前が確認して報告しろ
process.nextTick()もsetImmediate()もsetTimeout()もそうなってるよ
どの関数もreturnして後続のコードが実行されてイベントループに戻るより前に
コールバックが呼ばれることはない
> > Chrome開発版や他のブラウザだとブレークするのか?
> 通常のChromeとFirefoxでブレークするのを確認した
>>54が引用されてるが、それはお前の言う「ハンドリングしてない予期しない例外」
とは別の「ハンドリングしてないreject」の話だぞ
>>54の一行目にそう書いてあるだろ
それより
> まったくハンドリングしてない予期しない例外でも内蔵Promiseならデバッガが
> 気を効かせて例外を通知してくれるって事を言ってんのに
について具体的にコードでも書いて説明してくれよ
日本語じゃまともに通じてないんだからその方がお互い手っ取り早いだろ?
0058デフォルトの名無しさん
2015/01/05(月) 20:47:12.39ID:xBMPeqox>>56
> 通常のChromeとFirefoxでブレークするのを確認した
まずは確認だが、Chromeで"Pause On Caught Exceptions"は外してるよな?
あれはハンドリング「してる」例外でもブレークするからここでは邪魔になる
その上で、rejectをハンドリングしている
Promise.resolve(true).then(function(v) {
throw new Error('then');
}).catch(function(e) {
console.log(e);
});
はブレークしないが、rejectをハンドリングしていない
Promise.resolve(true).then(function(v) {
throw new Error('then');
});
はブレークするのを確認した、ということで間違いないか?
俺のChrome 39ではどちらもブレークしない
(通常の「ハンドリングしてない例外」はもちろんブレークする)
もしChromeの設定が必要なら教えて欲しい
0059デフォルトの名無しさん
2015/01/05(月) 20:56:09.22ID:xBMPeqox例外ではなくrejectの話ということがより明確になるようにコードを修正した
rejectをハンドリングしている
Promise.resolve(true).then(function(v) {
return Promise.reject(new Error('then'));
}).catch(function(e) {
console.log(e);
});
はブレークしないが、rejectをハンドリングしていない
Promise.resolve(true).then(function(v) {
return Promise.reject(new Error('then'));
});
はブレークするのか?
ちなみにQを使う場合はQ.getUnhandledReasons()で
「ハンドリングしてないreject」の一覧を取得できる
nodeではsetInterval()で定期的にログ出力すればデバッガの必要性は低い
0060デフォルトの名無しさん
2015/01/05(月) 22:13:35.53ID:gHiAPMtv> process.nextTick()もsetImmediate()もsetTimeout()もそうなってるよ
調べもせずに適当な事言うなよ
少なくともsetTimeout()は絶対違う
他は日本語が意味不明
Promise.resolve(true).then(function(v) {
throw new Error('then'); ← ここでデバッガがブレークする
});
アホなお前はこれでも理解出来ないと思うが、俺はこれ以上説明しない
> nodeではsetInterval()で定期的にログ出力すればデバッガの必要性は低い
糞みたいな負け惜しみすんなよw
0061デフォルトの名無しさん
2015/01/05(月) 22:22:33.23ID:gHiAPMtv捕捉するがタイムアウト時間を1msとかにすれば、99.9%実用上問題無いだろう
だが「確実」に非同期にするという事とは全く意味が違う
>>58
> もしChromeの設定が必要なら教えて欲しい
デバッガのデフォ設定では飲み込まれて無反応だ
さんざんケチつけてる割にはそんな簡単な設定も分からんか
ただ、激しくスレチな事なんで無理もないからそろそろ黙ってくれ
0062デフォルトの名無しさん
2015/01/05(月) 23:31:48.05ID:xBMPeqox> 調べもせずに適当な事言うなよ
調べて言ってるけど?
まずは仕様
https://html.spec.whatwg.org/multipage/webappapis.html#timers
"timer initialisation steps"の10で"Return handle, and then continue running this algorithm in parallel."
となっていて、コールバックが呼び出されるのは14の"Queue the task task."によってだ
そしてNodeの実装
https://github.com/joyent/node/blob/v0.10/lib/timers.js#L194
203行目でTimeoutオブジェクトを作って225行目でactive()に渡してる
175行目からのactive()はリストにTimeoutオブジェクトを追加してるだけ
どうやってもsetTimeout()がreturnする前にコールバックが呼ばれることはない
> 少なくともsetTimeout()は絶対違う
その根拠は? お前は主張するばっかで根拠は何も示さないのな
>>61
> 捕捉するがタイムアウト時間を1msとかにすれば、99.9%実用上問題無いだろう
> だが「確実」に非同期にするという事とは全く意味が違う
お前「非同期」の意味わかってる? タイムアウト時間は非同期とは一切関係ないぞ
setTimeout()は常にコールバックを非同期に実行する
ただしコールバックが実行されるまでの時間は指定したとおりになるとは限らないだけだ
特にネストした呼び出しでは0〜3msを指定しても最低4msは待たされる(上の仕様に書いてある)
だが常に非同期だ
0063デフォルトの名無しさん
2015/01/05(月) 23:36:20.18ID:xBMPeqox> 他は日本語が意味不明
お互いになw でもJSのコードは分かっただろ?
だからお前が言いたいこともコードで示してくれって何度も言ってるわけだ
なんでコードで書かないんだ?
> Promise.resolve(true).then(function(v) {
> throw new Error('then'); ← ここでデバッガがブレークする
> });
それだけだと"Pause On Caught Exceptions"を有効にしてるようにしか見えないな
その場合ブレークするのは内蔵Promise一切関係ないからな
catch()してるケースではどうなんだ? ブレークしちゃうんじゃねーの?
>>59のPromise.reject()版でもブレークするのか? しないんじゃねーの?
> アホなお前はこれでも理解出来ないと思うが、俺はこれ以上説明しない
それこそ負け惜しみだろw
「しない」じゃなくて「できない」んじゃねーの?
> > nodeではsetInterval()で定期的にログ出力すればデバッガの必要性は低い
> 糞みたいな負け惜しみすんなよw
繰り返すけどここはサーバサイドJSスレなんでな
動かしっぱなしのサーバではロギングして調べる方が基本なんだよ
ぶっちゃけこのスレでもNodeでデバッガ普段使いしてるヤツの方が少数派じゃね?
他の人どうよ?
0064デフォルトの名無しさん
2015/01/05(月) 23:38:49.17ID:xBMPeqox> デバッガのデフォ設定では飲み込まれて無反応だ
> さんざんケチつけてる割にはそんな簡単な設定も分からんか
わからんな
頼むから教えてくれよ
煽るより少ない文字数で終了するだろ
> ただ、激しくスレチな事なんで無理もないからそろそろ黙ってくれ
何を今更w
>>55とか他の人も興味あるかもしれないだろ
そんな簡単な設定ならさっさと書いてくれよ
0065デフォルトの名無しさん
2015/01/05(月) 23:41:57.54ID:gHiAPMtvThis API does not guarantee that timers will run exactly on schedule.
って書いてある
いつ実行されるか保証してないじゃん
上の方のa += 1;を実行するまでに100msの時間が掛かったとすると、その前に実行される可能性がある
0066デフォルトの名無しさん
2015/01/05(月) 23:57:22.85ID:gHiAPMtvとりあえずソースをあたったみるから待ってろ
それで全て解決だ
ソースを落とすには滅茶苦茶時間掛かるし、ブラウザで探すにしても時間が掛かる
> わからんな
> 頼むから教えてくれよ
デベロッパーツールを出して一番右にある黒丸に縦二重線のPause on exceptionsを押しといてリロードだよ
0067デフォルトの名無しさん
2015/01/05(月) 23:59:55.31ID:xBMPeqox> いつ実行されるか保証してないじゃん
それ俺が書いた
> ただしコールバックが実行されるまでの時間は指定したとおりになるとは限らないだけだ
のことな
> 上の方のa += 1;を実行するまでに100msの時間が掛かったとすると、その前に実行される可能性がある
その可能性はないんだよ
ステップの10でリターンした「後」、残りのステップは並列に実行される可能性がある
その一つのステップ14でコールバックを実行するタスクがキューに入れられる
タスクはキューに入れられるだけで実行はされない
そしてそのタスクがキューから取り出されて実行されるのは制御がイベントループに戻った後だ
お前の言うa += 1;の実行が終わらない限り制御がイベントループに戻ることはない
だからsetTimeout()はタイムアウト時間に一切関係なく常に非同期だ
詳細は"14. Queue the task task."のリンク先を見てくれ
そんな難しく考えなくてもシングルスレッドなんだからわかりそうなもんだがw
0068デフォルトの名無しさん
2015/01/06(火) 00:14:54.50ID:KFlyuGQs> そしてそのタスクがキューから取り出されて実行されるのは制御がイベントループに戻った後だ
イベントループに戻るのはsetTimeout()の直後の位置だ (a += 1;の前)
0069デフォルトの名無しさん
2015/01/06(火) 00:22:50.21ID:oSSj0EiH> デベロッパーツールを出して一番右にある黒丸に縦二重線のPause on exceptionsを押しといてリロードだよ
それ黒丸に縦二重線を押して出てくるパネルにあるチェックボックスのことだよな?
それ「Pause on exceptions」じゃなくて「Pause On Caught Exceptions」だよな?
俺がこれまで書いた↓全然読んでなかったのかwwwwww
>>58
> まずは確認だが、Chromeで"Pause On Caught Exceptions"は外してるよな?
>>63
> それだけだと"Pause On Caught Exceptions"を有効にしてるようにしか見えないな
"Pause On Caught Exceptions"って有効にすると
try {
throw new Error('err'); //ここでもブレークする!
} catch (e) {
console.log('handled');
}
こんなのまでブレークしちゃう代物なわけよ
内蔵Promiseがどうとか一切関係なく、自前のライブラリだろうがなんだろうが
どこでも例外スローするとブレークするオプションなわけじゃん
内蔵Promiseでないと実装できないとかって話と何の関係ないよな?
>>24
> > ・飲み込まれた例外をデバッグ出来る
> そりゃ、ライブラリ内部のcatch内にブレークポイントを張って待ちかまえていれば
> 可能だが毎回そんな事すんのか?いやするわけない
> そして例外がスルーされて何も起きない
↑の説明は"Pause On Caught Exceptions"と矛盾してることはわかるか?
0070デフォルトの名無しさん
2015/01/06(火) 00:29:21.55ID:oSSj0EiH> イベントループに戻るのはsetTimeout()の直後の位置だ (a += 1;の前)
は? え? え?
setTimeout(function() {
...
}, 0);
// (a)
a += 1;
こういうコードで(a)の位置でイベントループに戻ると思ってるわけ?
いやいやいや、いくらなんでもそれは。。。 あー
0071デフォルトの名無しさん
2015/01/06(火) 00:39:58.23ID:KFlyuGQsあっそう、俺はFirefoxしか使ってないからChromeの事はそれでいいと思ったよ
Firefoxだと
try {
throw new Error('err'); // ここでブレークしないで
} catch (e) {
console.log('handled');
}
Promise.resolve(true).then(function(v) {
throw new Error('then'); // ここでブレークする
});
になる
もはやV8とも関係無くて悪いなw
0072デフォルトの名無しさん
2015/01/06(火) 00:44:09.33ID:KFlyuGQsChromeでPromiseをブレークさせる方法は無いのか何らかの方法があるのか調べておくよ
0073デフォルトの名無しさん
2015/01/06(火) 00:48:43.95ID:oSSj0EiH別にいいよ、開発版で取り組んでるから
https://code.google.com/p/v8/issues/detail?id=3093
https://code.google.com/p/chromium/issues/detail?id=393913
0074デフォルトの名無しさん
2015/01/06(火) 02:04:56.21ID:KFlyuGQsPromiseの仕様的にイベントループが1回以上発生する事を保証しないといけないから
setTimeout()では完全ではないということだな
はいおしまい
0075デフォルトの名無しさん
2015/01/06(火) 05:03:53.45ID:D9r7QrzV0076デフォルトの名無しさん
2015/01/06(火) 15:07:59.00ID:LUJGb7UTイベントループ=非同期
って話してるのかと思った(笑)
何に対しての同期かにもよるだろうけどね
0077デフォルトの名無しさん
2015/01/06(火) 19:05:27.58ID:oSSj0EiHJSの世界(特にコールバック絡み)で同期・非同期といったら
function foo(function callback() {
... //(1)
});
... //(2)
(1)->(2)で実行されるのが同期 (Array.forEach()とか)
(2)->(1)で実行されるのが非同期 (setTimeout()とか)
「Effective JavaScript」の項目67とか以下とか参照
http://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/
0078デフォルトの名無しさん
2015/01/06(火) 20:55:50.08ID:Xd0L/8rv> 「Promiseを理解しないと非同期のメリットを生かせない」ってのは
> 表層しか理解してないって証だわな
真理だったな
0079デフォルトの名無しさん
2015/01/06(火) 22:25:56.23ID:QIYM1JY4NodeのIOは非同期、つまり別スレッドで行われる
0080デフォルトの名無しさん
2015/01/06(火) 22:40:06.78ID:oSSj0EiHまぁまぁw
>>79
別スレッドなのはファイルだけでネットワークやパイプはメインスレッドだよ
Windowsではファイルもメインスレッドかもしれん
0081デフォルトの名無しさん
2015/01/06(火) 23:38:13.20ID:KFlyuGQsただ煽ってるだけだろ
理由を述べよ
すぐに理由を述べられなければただの煽りと認定する (たぶん無理だろうけど)
0082デフォルトの名無しさん
2015/01/06(火) 23:44:03.55ID:KFlyuGQs何がまぁまぁだよw
お前もどうせ無能なんだろ
とりあえずすぐに理由を言ってみろよ、言えないくせに
0083デフォルトの名無しさん
2015/01/07(水) 14:59:21.93ID:R3Z2NWM/そんな事無いだろ
メインスレッドでやる意味ないし
0084デフォルトの名無しさん
2015/01/07(水) 20:07:44.58ID:OxX2nn0Y逆に考えるんだ
ネットやパイプはノンブロッキングI/Oで多重化できるからワーカスレッドでやる意味の方がない
UnixのファイルI/OはそれができないからワーカスレッドでブロッキングI/Oせざるを得ない
以下のNoteにもそういうことが書いてある
http://nikhilm.github.io/uvbook/filesystem.html
ソースだとファイル系の操作(839行目〜)はみんな以下のPOSTマクロを使ってる
https://github.com/libuv/libuv/blob/v1.x/src/unix/fs.c#L97
その中のuv__work_submit()がワーカスレッドに処理を依頼する関数
ネットやパイプではそんなことしてない
詳細を知りたければブロッキングI/O、ノンブロッキングI/O、
多重化、非同期I/Oと順に説明してる解説を読むといい
そしてUnixでは本物の非同期I/Oは事実上ないことを知るw
0085デフォルトの名無しさん
2015/01/13(火) 15:11:04.11ID:LHG94Mluv8エンジンのおかげで node より大幅速度向上。
本日は io.js の誕生日であるとともに node の命日ともなりましたナムナム
0086デフォルトの名無しさん
2015/01/14(水) 08:06:57.60ID:EnBoJmyV0087デフォルトの名無しさん
2015/01/14(水) 22:24:56.52ID:knoTvZInが、node-gypがライブラリをダウンロード出来ずビルドに失敗したり
v8のAPI変更でnanがコンパイル失敗したり
ちょっと困った
node-gypはどこに対策版があるか分からず自分でちまちまファイル名を直した
nanは本家リポジトリに対策版のブランチあり
0088デフォルトの名無しさん
2015/01/14(水) 22:26:05.98ID:knoTvZIn後、Path追加するように指定してインストールしたつもりなのに何故か追加されてない
0089デフォルトの名無しさん
2015/01/16(金) 14:43:45.88ID:sXdFjxSo基本が非同期ってのが面倒。
同期のJavascriptとは別物だ。
同期のソースコードに適合させたい。
これはどうやったら実現できますか。 downloadでの同期処理。
data = download("http://www.google.co.jp/");
dataに対する処理;
0090デフォルトの名無しさん
2015/01/16(金) 14:55:27.50ID:sXdFjxSourl = "http://www.google.co.jp/";
data = download(url);
console.log(data);
function download(url) {
data = undefined;
request = require('superagent');
request.get(url)
.end( function(resp){ data = resp.res.text; });
for(i=0; i<10 && data==undefined; i++) setTimeout(null, 500);
return data;
}
0091デフォルトの名無しさん
2015/01/16(金) 15:07:39.68ID:WEjV0wIzgeneratorで擬似的にやるかasync/awaitを待て
0092デフォルトの名無しさん
2015/01/16(金) 17:26:44.61ID:x/KvFbcSこんなんでいいんじゃない?
var httpsync = require('httpsync');
var url = "http://www.google.co.jp/";
var req = httpsync.get(url);
var res = req.end();
var data = res.data.toString();
console.log(data);
0093デフォルトの名無しさん
2015/01/16(金) 17:44:25.51ID:TPIs3k36使うべきはメインスレッドをブロックする同期IOなんかじゃなくて
当然非同期IOだよな
0094デフォルトの名無しさん
2015/01/16(金) 17:52:01.40ID:+cZ2zonb0095デフォルトの名無しさん
2015/01/16(金) 20:23:30.77ID:lUd0kLGp0096デフォルトの名無しさん
2015/01/16(金) 22:01:52.67ID:TPIs3k36Thread-based networking is relatively inefficient and very difficult to use.
とか
http://nodejs.org/about/
0097デフォルトの名無しさん
2015/01/16(金) 22:55:28.32ID:gHXWvVDxこんなのあるから暇なヤツは聞いてみれ(ES7ってことはasync/awaitだろうけど)
https://player.fm/series/lately-in-javascript-podcast/asynchronous-javascript-without-callbacks-in-ecmascript-7-lately-in-javascript-podcast-episode-50
0098デフォルトの名無しさん
2015/01/18(日) 09:56:30.56ID:5wNJLYNH0099デフォルトの名無しさん
2015/01/18(日) 17:21:38.41ID:ckxewJLG0100デフォルトの名無しさん
2015/01/18(日) 21:30:04.25ID:ohcYLEp30101デフォルトの名無しさん
2015/01/19(月) 13:14:20.73ID:KroxEeJe『【翻訳】多種多様な基準から見るプログラマの市場価値』
http://postd.cc/how-much-do-you-cost/
■ このスレッドは過去ログ倉庫に格納されています