はじめに
MomentをサーバサイドJava※などのマルチスレッド環境で動作させているという奇特?な人向けに共有。Node.js環境な人は無視していいです。
日付系処理によく使われる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 でプルリクも出しておいた。次のバージョンで取り込んでもらえそうな感じです。