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

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

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

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

Q&A

解決済

2回答

1523閲覧

非同期処理でanimate.cssを使う

rutawaru

総合スコア22

JavaScript

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

0グッド

0クリップ

投稿2018/04/03 12:34

編集2018/04/03 14:14

ビットコインのレートをAPIで取得し、ajax、setIntervalで1秒ごとに値を更新しています。

平均すると10秒に1回ほど値が変わるのですが、値が変わった時にanimate.cssのbounceクラスをaddclassし、バウンドさせたいです。

callback関数の呼び出される方の関数でifを使い、値が変わった瞬間、変数midと変数mid_delayがノットイコールになる瞬間にaddclassさせ、その後に変数midと変数mid_delayをイコールにれば良いと考えたのですが、うまくいきません。

 コンソールログでUncaught TypeError: callback is not a functionと出るので、コールバック自体上手くいってないみたいです。

どうすればうまくいくでしょうか。
全然違うコーディングでも良いので、教えてください。

javascript

1var API_URL = "https://bitflyer.jp/" 2 var API_PATH = "api/echo/price" 3 var GET_URL = API_URL + API_PATH; 4 var mid_delay = 0; 5 6 var mid_sync = function(){ 7 mid_delay = mid 8 }; 9 10 11 //価格表示用MID取得 12 var GET_MID = function(callback) {$.getJSON( 13 GET_URL, //リクエストURL 14 null, //送信データ 15 function(jsonData, status) { 16 mid = jsonData['mid']; 17 var elem = document.getElementById("value"); 18 elem.innerText = Math.round(mid); //#valueにmidを挿入 19 }) 20 callback() 21 }; 22 23 console.log(GET_MID); 24 25 var add_bounce = function (){ 26 if (mid_delay != mid){ 27 $('#animated').addClass('bounce'); 28 $('#animated').removeClass('bounce'); 29 } 30 mid_sync(); 31 }; 32 33 //1000ミリ秒で自動的に価格更新 34 setInterval(GET_MID.bind(undefined, "add_bounce"),1000);

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

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

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

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

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

m.ts10806

2018/04/04 00:14

ひとまずエラーメッセージの通りですが、javascriptって関数名に変数を利用できなかったように思います。 callback() は実質何をさせたいのでしょうか?
guest

回答2

0

コンソールログでUncaught TypeError: callback is not a functionと出るので、コールバック自体上手くいってないみたいです。

var GET_MID = function(callback) { callback(); } var add_bounce = function() { console.log('add_bounce'); } setTimeout(GET_MID.bind(null, 'add_bounce'), 100)

コードを回答用に単純化してしまいましたが、上記は元のコードのつもりです。
このコードの場合、bindの第2引数に関数ではなく文字列を渡してしまっています。
その結果、callback()のところがadd_bounce()ではなく"add_bounce"()となり、callback is not a functionとなりコケます。

var GET_MID = function(callback) { callback(); } var add_bounce = function() { console.log('add_bounce'); } setTimeout(GET_MID.bind(null, add_bounce), 100)

なので、このように関数を渡す必要があります。

他にも期待通りの動きにならないであろう部分が確認出来ますが、
mid_delaymidで何であるか、また、これらで何をしたいのかが、
いまいち、質問文からは分かりませんでしたので、ここから先の回答は具体的な回答は控えます。

もし、midがAPIから取得した前回の値で、mid_delayがAPIから取得した新しい値であり、それらの値が異なる場合にのみ、画面の一部を更新したいという話なのであれば、$.getJSONの第3引数に渡しているコールバック関数の中で、今そのコールバック関数の中でやっている処理も、また、add_bounce関数の中でやっている処理も入れてあげないと上手くいかないかと思います。

今はadd_bounce関数の中で行われる処理が$.getJSONの第3引数の中に含まれていないので、期待したタイミングで実行されていないかと思います。

一旦、DOM周りの操作を除外したシンプルなコードで期待した動作をするように修正してから、DOM周りの操作を追加するというステップを踏んだ方が前に進みやすいかと思いますので良かったら試してみてください。(GET_MIDの引数にコールバック関数を渡すことは必須ではないと思うので、その辺も検討してみてください)

投稿2018/04/04 00:36

編集2018/04/04 00:53
HayatoKamono

総合スコア2415

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

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

rutawaru

2018/04/05 10:53

説明不足ですいませんでした。 DOM周りを整理しましたら、できました。
HayatoKamono

2018/04/05 11:14

解決したようで良かったです。それでは、質問を閉じてしまって下さい。
guest

0

自己解決

このページを見ていた方、説明不足ですいませんでした。

やりたいことは下記の画像のようなページでajax自動更新で、価格が変更したら、バウンドさせるという事でした。
![イメージ説明説明]

下記コードで自己解決しました。

まずコールバック関数に""がついていて、作動していませんでした。

その後getJSONで取得したデータを関数の外で取得するため、bind(this)を使いました。

原因が分からないのですが「this.elem.innerText = Math.round(this.mid); //#valueにmidを挿入」これがgetJSONの所にあると価格が変更してから、次のsetinterval(1.5秒後くらい)でバウンドになってしまったので、「$('.animated').addClass('bounce'); //bounceクラスを追加」と同じ所に移動させました。
そうしたら価格表示が変更したタイミングと同じタイミングでバウンドしました。

変数のスコープ、thisの使い方、コールバック関数などを学べたので、良かったです。

javascript

1 var API_URL = "https://bitflyer.jp/" 2 var API_PATH = "api/echo/price" 3 var GET_URL = API_URL + API_PATH; 4 5 //this.mid_delayとthis.midを同じ値にする関数 6 var mid_sync = function(){ 7 this.mid_delay = this.mid 8 }; 9 10 //価格表示用MID取得 11 var GET_MID = function (callback) {$.getJSON( 12 GET_URL, //リクエストURL 13 null, //送信データ 14 function(jsonData, status) { 15 this.mid = jsonData['mid'];//jsondatamidをthis.midに代入 16 this.elem = document.getElementById("value"); 17 }.bind(this))//getJSONで取得したmidのスコープを関数の外側にする 18 $('.animated').removeClass('bounce'); 19 callback()//GET_MIDのコールバックにadd_bounce関数を実行 20 }; 21 22 23 24 //価格が変更したらbounceクラスを追加して、バウンド表示させる 25 var add_bounce = function (){ 26 if (this.mid_delay != this.mid){//this.mid_delayとthis.midが違う値であればバウンドさせる 27 this.elem.innerText = Math.round(this.mid); //#valueにmidを挿入 28 $('.animated').addClass('bounce'); //bounceクラスを追加 29 mid_sync();//this.mid_delayとthis.midを同じ値にする 30 } 31 }; 32 33 //1500ミリ秒で自動的に価格更新 34 setInterval(GET_MID.bind(undefined, add_bounce),1500);

html

1<html> 2<body> 3 <title>ビットコイン現在の価格(円)</title> 4 <h1>ビットコイン現在の価格(円)</h1> 5 <div class='animated' id="value"></div> 6</body> 7</html>

投稿2018/04/05 11:29

編集2018/04/05 11:39
rutawaru

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問