不具合の概要
LGTMoonで「最近の画像」が更新されない部具合が発生していました。
LGTMoonはの「最近の画像」ページでは、最新の画像が存在しているかどうかを常にポーリングしており、画像の生成が完了したら自動的に「最新の画像」ページに出てくるようになっておりました。

またその影響で「画像がうまく生成されない」と勘違いされたのか、同じ画像が連続で生成されるケースも増えました。
不具合発生期間
2019年2月21日 〜 2019年4月6日
不具合の原因
2019年2月に、Vue.js のバージョンを1から2に上げるために大規模な修正を入れたのですが、その際にこの不具合が発生しておりました。
4月5日に修正を入れたのですが、それでもまだ治っておらず、4月6日で修正されました。修正箇所は以下の通りです。
バグ修正 · yoshikyoto/lgtmoon@4cdde95 · GitHub
もともとコードはこのようになっておりました。
// 最新の画像を読み込む
axios.get('/api/v1/images/recent.json').then((response) => {
this.recentItems = response.data.images
});
// 10秒ごとに画像一覧を更新
setInterval(function () {
axios.get('/api/v1/images/recent.json').then((response) => {
this.recentItems = response.data.images
});
}, 10000);
ここで注意しなければならないのが、 this の扱いです。
// 最新の画像を読む込む の this.recentItems の部分は、vue.recentItems になりますが、 setInterval の中での this は vue にはならないのです。ここで、こうする必要がありました。
// 最新の画像を読み込む
const thisVue = this
axios.get('/api/v1/images/recent.json').then((response) => {
thisVue.recentItems = response.data.images
});
// 10秒ごとに画像一覧を更新
setInterval(function () {
axios.get('/api/v1/images/recent.json').then((response) => {
thisVue.recentItems = response.data.images
});
}, 10000);
最初に const thisVue = this とし、この thisVue の方を使うようにするのです。このテクニックは JavaSctipt では頻出なので覚えておいたほうが良いです。この修正により、LGTMoonの不具合はなおりました。
その他
同じ画像を連打されるケースに関しましては対応を入れたいところなのですが、コストが避けずにまだ入れられてないです。連打されなくても、同じ画像から過去に生成されていた場合は、基本的には過去のものを引っ張ってきたほうがストレージには優しいので、検討したいです。
まとめ
- JavaScriptのthisには注意しましょう