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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

3回答

715閲覧

promise 内での setTimeout について

u.sayaka0112

総合スコア38

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2020/05/07 11:31

前提・実現したいこと

firebase を使用して簡単なアプリを作成しています。
ユーザーの退会処理完了時に、
「ご利用ありがとうございました。10秒後にHPに移動します」
というメッセージを出して、10秒後にHPに遷移させるように試みています。
10秒後の遷移については、setTimeoutを使用して実現しようとしています。

発生している問題・エラーメッセージ

promise 内で setTimeout を使っているがうまく動作しない(即時実行される)。

該当のソースコード

js

1... 2 to_landingPage() { 3 self.$router.push("/landing_page"); 4 }, 5 withdrawal() { 6 const self = this; 7 self.is_loading = true; 8 let user = firebase.auth().currentUser; 9 10 user 11 .delete() 12 .then(function() { 13 // 削除した旨伝えてリダイレクトさせる 14 self.is_loading = false; 15 self.is_withdrawal = true; 16 }) 17 .then(function() { 18 setTimeout(self.to_landingPage, 10000); 19 }) 20 .catch(function(e) { 21 // エラーを伝える 22 console.log(e.message); 23 self.is_loading = false; 24 self.is_withdrawal = false; 25 }); 26...

試したこと

.then(function() { setTimeout(self.to_landingPage, 10000); })

の箇所をいろいろ書き直してみました。

// 即時実行 .then( setTimeout(self.to_landingPage, 10000); ) // 即時実行 .then( setTimeout(function(){self.to_landingPage}, 10000); )

ご存知の方がいらっしゃいましたら、教えていただけると幸いです!

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

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

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

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

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

R.Mizukami

2020/05/07 11:49

どこから 10 秒後にどの処理を実行したいのでしょうか。 現在のコードでも、delete() 完了から 10 秒後に to_landingPage() が実行されますよね? // 削除した旨伝えて…… の部分実行後 10 秒後ということなら、原因はおそらくこのコメントで省略された部分にあるので、そちらのコードを提示いただくといいと思います。
u.sayaka0112

2020/05/07 11:56

>現在のコードでも、delete() 完了から 10 秒後に to_landingPage() が実行されますよね? これがされないんです。。 > // 削除した旨伝えて…… ここには何も書いていません。紛らわしくてすみません。。withdrawal = true にすることで、メッセージを表示するようにしています。
ku__ra__ge

2020/05/07 13:01

this.$router じゃなく self.$router になってるのが気になるんですが、単純にto_landingPageを呼び出すことで間違いなくページ遷移できますか?
u.sayaka0112

2020/05/07 13:07 編集

const self = this; で代入しているので大丈夫だと思います。遷移自体は問題なくできています。
u.sayaka0112

2020/05/18 07:47

to_landingPage() { self.$router.push("/landing_page"); }, ここで const self = this; が抜けてました...
guest

回答3

0

ベストアンサー

以下コードでは10秒後にto_landingPageメソッドが正しく呼び出されます。
問題は提示されたコード部分以外にあるのではないでしょうか?

javascript

1let hogeObj = { 2 to_landingPage() { 3 console.log("to_landingPage called."); 4 }, 5 withdrawal() { 6 const self = this; 7 8 let user = { // dummy object 9 delete(){ 10 console.log("user.delete called."); 11 return Promise.resolve(); 12 } 13 }; 14 15 user 16 .delete() 17 .then(function() { 18 // 削除した旨伝えてリダイレクトさせる 19 self.is_loading = false; 20 self.is_withdrawal = true; 21 }) 22 .then(function() { 23 setTimeout(self.to_landingPage, 10000); 24 }) 25 .catch(function(e) { 26 // エラーを伝える 27 console.log(e.message); 28 self.is_loading = false; 29 self.is_withdrawal = false; 30 }); 31 } 32}; 33 34hogeObj.withdrawal();

投稿2020/05/08 03:02

ku__ra__ge

総合スコア4524

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

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

0

promiseでsetTimeoutを待つにはresolverを発行してsetTimeout内で実行させてください

投稿2020/05/07 12:04

yambejp

総合スコア116724

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

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

0

setTimeoutはなんか引数の渡し方がややこしいみたいです

https://qiita.com/kouhe1/items/9c23604901039832d385
https://qiita.com/sirojake/items/26618081bbb33e918aa4

この辺りを参考にしてみてください

投稿2020/05/07 11:40

okina

総合スコア471

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問