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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

4回答

1282閲覧

遅延実行をしたいがエラー発生する

TanakashiXr

総合スコア57

JavaScript

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

0グッド

0クリップ

投稿2018/03/09 00:53

編集2018/03/09 00:56

JavaScriptの文にて、遅延実行をさせたいのですがエラーが発生します。

UTF

1if(txt == 'help jp' && isAdminOrBot(seq.from_)) { 2 seq.text = this.jphelp; 3 this._client.sendMessage(0, seq); 4 }

上記を下記のようにしました。

UTF

1if(txt == 'help jp' && isAdminOrBot(seq.from_)) { 2 setTimeout( function() { 3 seq.text = this.jphelp; 4 this._client.sendMessage(0, seq); 5 }, 1500 ); 6 }

実行すると下記のようなエラーが発生します。

UTF

1TypeError: Cannot read property 'sendMessage' of undefined 2 at Timeout._onTimeout (/root/LineAlphatFork/src/main.js:1380:21) 3 at ontimeout (timers.js:458:11) 4 at tryOnTimeout (timers.js:296:5) 5 at Timer.listOnTimeout (timers.js:259:5)

解決方法のご存知の方、修正お願いします。

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

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

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

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

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

m.ts10806

2018/03/09 00:56

「修正お願いします」とはどのような回答を想定しての依頼でしょうか。
m.ts10806

2018/03/09 00:57

いずれにしてもコードがこれだけでは分かりません。エラーメッセージが「 Cannot read property 'sendMessage' of undefined」とちゃんとなぜ動かないのか教えてくれているので、まずはその通りやってみてはいかがでしょうか。
guest

回答4

0

ベストアンサー

this の指すものが変わるからだと思います。

js

1if(txt == 'help jp' && isAdminOrBot(seq.from_)) { 2 let _this = this; 3 setTimeout( function() { 4 seq.text = _this.jphelp; 5 _this._client.sendMessage(0, seq); 6 }, 1500 ); 7 }

投稿2018/03/09 00:59

kei344

総合スコア69400

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

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

0

thisbindすればいいと思います。
参考:JS 呼び出し元の this を担保するメモ。 - かもメモ

投稿2018/03/09 01:01

編集2018/03/09 01:03
Lhankor_Mhy

総合スコア36074

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

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

0

単純にthisの使い方が違うのでは
ライブラリの仕様がわかりかねますがたとえば

javascript

1if(txt == 'help jp' && isAdminOrBot(seq.from_)) { 2 var me=this; 3 setTimeout( function() { 4 seq.text = me.jphelp; 5 me._client.sendMessage(0, seq); 6 }, 1500 ); 7}

のようなその場しのぎの処理とか・・・
ただし非同期処理を走らせると処理順に不整合が出る場合もあるので
promiseを利用するなど工夫が必要かもしれません。

投稿2018/03/09 01:03

yambejp

総合スコア114779

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

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

0

kei344さんがおっしゃる通り、
setTimeoutの中身では、
thisにsetTimeout自身が入ります。

↓私が見たタイミングが悪かったようです。
下記は無視してください。

まず、一個目のソースコードと、
二個目のソースコードが全く同じに見えるのですが・・・。

ここの部分だけ掲示されても、回答しようがありません。
ソース全体だと長いのでしょうが、
せめて、変数を定義している箇所だけでも、ソースコードに記載していただかないと。

エラーから解析するに、
「Timeout._onTimeoutの中に、sendMessageは入ってないよ!」
ってエラーなので、
sendMessageを定義している箇所、タイミングを再度確認してみてください。

投稿2018/03/09 00:59

編集2018/03/09 01:05
miyabi_takatsuk

総合スコア9528

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

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

TanakashiXr

2018/03/09 01:00

ごめんなさい。 修正いたしました。 更新をお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問