LoginSignup
1
0

More than 5 years have passed since last update.

Momentのマルチスレッド問題

Posted at

はじめに

MomentをサーバサイドJava※などのマルチスレッド環境で動作させているという奇特?な人向けに共有。Node.js環境な人は無視していいです。

RhinoとかJDK標準のNashornを使うなど

日付系処理によく使われるJavaScriptライブラリのMomentを、マルチスレッドで共有して使うと問題が発生する恐れがある (スレッド毎に独立して処理している場合は問題ない)。

発生するバージョン

Moment 2.12.0 以下

現象

現象としては、フォーマット処理で変な値が返ってきたりする。現在日時をYYYY-MM-DD HH:mm:ss.SSSでフォーマットしても、2016-04-::25.435みたいになったりする。

フォーマット処理
var now = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
console.log(now); // => 2016-04-::25.435

その他、TypeError: Cannot find function call in object -. みたいなエラーがスローされることもある。

MomentのIssueにも2014年に挙げられている。 → https://github.com/moment/moment/issues/1756
が、未対応でクローズされていた。

原因

のforループで使用しているインデックス変数のiがマルチスレッドで共有されているため。

解決策

そもそもマルチスレッドで共有すんな、という話もあるが、、、大人の事情でそこは直せないこともあるかと。

問題のfor文ではiを0で初期化して使っている物なので、ここでvar宣言しておいてスコープをこの無名関数内とし、マルチスレッドで共有されないようにすれば良い。

https://github.com/moment/moment/pull/3109 でプルリクも出しておいた。次のバージョンで取り込んでもらえそうな感じです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0