質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

706閲覧

Node.jsのprocess.nextTickについて

jude

総合スコア14

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/11/08 14:33

js

1 2process.nextTick(() => { 3 Promise.resolve().then(() => console.log('PROMISE1')) 4 console.log('next tick1') 5 process.nextTick(() => { 6 Promise.resolve().then(() => console.log('PROMISE2')) 7 console.log('next tick2') 8 process.nextTick(() => { 9 Promise.resolve().then(() => console.log('PROMISE3 ')) 10 console.log('next tick3') 11 }) 12 }) 13}) 14 15// 実行 16/* 17 * next tick1 18 * next tick2 19 * next tick3 20 * PROMISE1 21 * PROMISE2 22 * PROMISE3 23 */

process.nextTickで渡したコールバック関数は次のイベントループの最初に実行されると理解していますが、上の実行結果を見ると少し違うですかね?上のコードではprocess.nextTickはどのように動いてますか?
試しにprocess.nextTicksetImmediateにしたら思い通りに交互に実行されました。

曖昧な質問ですみません。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

process.nextTickで渡したコールバック関数は次のイベントループの最初に実行されると理解していますが

厳密にはnextTickはイベントループで走らず、
その手前の段階で動作するようです。
したがってPromiseを多数宣言しても1個たりとも動作せず、質問文のように全てのnextTickが先に処理されます。


この辺が詳しく載っています。
内部実装から読み解くNode.js(v11.0.0) Eventloop - Qiita

process.nextTick/Promiseのタイミング

  • process.nextTickはEventloop内ではなくユーザーランドの実行後
  • PromiseはJSレイヤーなので、Eventloop内ではなくユーザーランドの実行後

どちらが先?

  • PromiseはObject.observe()と同じ発火タイミングで、process.nextTick()の方が先になる

という訳でProcess.nextTickの方が優先順位が高くなります。
普段使いにはどちらが良いのか?という疑問が出ると思いますが、setImmediateをメインで使うと良いみたいですね。

setImmediate()とnextTick()なにが違うの - Qiita

要は、I/O処理より先に呼ばれるのがnextTickで後に呼ばれるのがsetImmediate。

eventloopの効率利用を考えると先にI/0処理したいので、setImmediate()を選択しとけば間違いなさそう。

投稿2018/11/09 05:14

編集2018/11/09 05:16
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jude

2018/11/09 11:47

イベントループで走らず、手前で再帰的に走っちゃうんですね。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問