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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

1191閲覧

Promiseのrejectのcatch方法

zohnam

総合スコア1441

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/07/11 04:30

編集2019/07/11 04:39

自前でデザインしたポップアップ確認画面の表示処理を、Promiseで実装しようとしています。

html

1<div id="confirm" style="display:none;"> 2 <div class="message"></div> 3 <div class="decide">OK</div> 4 <div class="cancel">キャンセル</div> 5</div>

javascript

1var confirm_res = null; 2var confirm_rej = null; 3$("#confirm .decide").click(function(){ 4 $("#confirm").hide(); 5 confirm_res(); 6}); 7$("#confirm .cancel").click(function(){ 8 $("#confirm").hide(); 9 //confirm_rej(); 10}); 11var confirm = function(html){ 12 $("#confirm").show().find(".message").html(html); 13 return new Promise(function(res,rej){ 14 confirm_res = res; 15 confirm_rej = rej; 16 }); 17};

以上が基本コードで、利用時には

javascript

1confirm("削除してよろしいですか?").then(function(){ 2 // 削除処理 3});

のようにしています。

これでひとまず動作するのは確認できたのですが、confirmで生成したPromiseオブジェクトは、ユーザがcancelをクリックしたらresolveもrejectもされずに
ほったらかしになってるのが気になります。
rejectしておきたいのですが、コメントアウトしているconfirm_rejを呼び出したら、

error

1(index):1 Uncaught (in promise)

とエラーが出てしまいます。このエラーを出さなくするためにはcatchを書けばいいみたいなことはわかりましたが、下手に書くとエラーが増えたり、キャンセルしたのにthen以下が実行されたりしてしまいます。
catchはどこにどう書けば適切に動いてくれるのでしょうか?

---- 追記 ---

javascript

1confirm("削除してよろしいですか?").then(function(){ 2 // 削除処理 3}).catch(function(e){});

呼び出し時にこうすればいいのはわかってますが、できればconfirm定義付近にcatchを書いておいて、呼び出し時には書かなくていいようにしたいのです。

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

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

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

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

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

yambejp

2019/07/11 04:47

なんのためのPromiseなのでしょうか?
zohnam

2019/07/11 05:16

元々このconfirmは単純なコールバックで実装していました。データ更新系の処理をするにあたって、条件次第で0~2回のconfirmを経由して処理するかどうかが決まる、ということになり、コールバック地獄回避のためにPromiseを習得して利用しようと考えました。javascriptとjQueryはそれなりに理解していますが、Promiseは初心者、という状況です。
mather

2019/07/22 05:12

> 質問者が6日前に「まだ回答を求めています」と言っています。 となっていますが、すでに回答は出ていますね。
guest

回答2

0

エラーが増えるのは別問題なので言及しません.

戻り値を設定してはどうでしょうか?

JavaScript

1 confirm_res(false);

JavaScript

1confirm("削除してよろしいですか?").then(function(res){ 2 if (res) { 3 // 削除処理 4 }

投稿2019/07/11 04:56

x_x

総合スコア13749

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

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

0

たとえばこんな感じ

test

引数が50より大きいときは1を足してresolveして、50以下は1を引いてrejectする

javascript

1const func=async x=>(x>50)?x+1:Promise.reject(x-1); 2func(100).then(x=>console.log("ok:"+x),x=>console.log("err:"+x)); 3func(10).then(x=>console.log("ok:"+x),x=>console.log("err:"+x));

明示的にcatchしたいなら

javascript

1func(10).then(x=>console.log("ok:"+x)).catch(x=>console.log("err:"+x));

でもよいかもしれません

投稿2019/07/11 05:27

編集2019/07/11 05:34
yambejp

総合スコア114747

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

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

yambejp

2019/07/11 05:30

より明確にするために rejectの戻り値をnew Error(・・・)としてもよいでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問