teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

Promise流儀のエラーハンドリングに変更

2020/11/09 18:50

投稿

miyabi-sun
miyabi-sun

スコア21459

answer CHANGED
@@ -15,13 +15,13 @@
15
15
  .catch(() => requestPromise.put(options))
16
16
  .catch(() => requestPromise.put(options))
17
17
  .catch(() => requestPromise.put(options))
18
- .catch(e => throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message));
18
+ .catch(e => Promise.reject(new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)));
19
19
  ```
20
20
 
21
21
  上記のコードはPromiseの中にPromiseという風に
22
22
  2重のPromiseの箱で包まれていますが問題ありません。
23
23
  `.then`や`.catch`の戻り値でPromiseがネストしている場合、
24
- それらを自動的に全て取り除いて値の状態にしてくれます。
24
+ それらを自動suna的に全て取り除いて値の状態にしてくれます。
25
25
 
26
26
  なのでユーザーとしては気にせずPromiseを返すような処理を
27
27
  がんがん`.then`や`.catch`メソッドでつないで行けば良いのです。
@@ -41,7 +41,7 @@
41
41
  // 代入しない場合、最初の挑戦に失敗すると同時並行で3個のリクエスト処理が同時に飛んでしまう
42
42
  putReq = putReq.catch(() => requestPromise.put(options));
43
43
  }
44
- putReq.catch(e => throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message));
44
+ putReq.catch(e => Promise.reject(new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)));
45
45
  var resp = await putReq;
46
46
  ```
47
47
 
@@ -54,31 +54,29 @@
54
54
  (p) => p.catch(() => requestPromise.put(options)),
55
55
  Promise.reject()
56
56
  ).catch(e =>
57
- throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)
57
+ Promise.reject(new Error("データ更新に失敗しました。 ErrorMessage : " + e.message))
58
58
  );
59
59
  ```
60
60
 
61
61
  ---
62
62
 
63
- 【おまけ】 エラーの書き方それよかったっけ?
63
+ 【おまけ】 素直にasync/await構文頑張る
64
64
 
65
- awaitが待たPromiseがPromise.reject終わりになる場合、
65
+ async/await構文を使てコードを書くとこんな感じになりますね。
66
- 外で包んだtry-catchで取得出来ます。
66
+ Promiseの糖衣構文という制約上、catchを握りつぶすのちょっとお行儀が悪いで
67
67
 
68
- 挙動の統一ということで解答欄はあのような記述にしましたが、ちゃんと動作するんでしょうかね?
69
- ちょっと不安……
70
-
71
- async/await構文を使っていくなら
72
- こっちの方が良いでしょう。
73
-
74
68
  ```js
69
+ var resp = null;
70
+ for (let i = 0; i < 4; i++) {
75
- try {
71
+ try {
76
- var resp = await requestPromise.put(options)
72
+ resp = await requestPromise.put(options);
77
- .catch(() => requestPromise.put(options))
73
+ break;
78
- .catch(() => requestPromise.put(options))
79
- .catch(() => requestPromise.put(options));
74
+ } catch (e) {} // お行儀が悪いがエラーは握りつぶす
80
- // 後続処理
75
+ }
81
- } catch (e) {
76
+ if (resp == null) {
82
77
  throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)
83
78
  }
84
- ```
79
+ ```
80
+
81
+ やはり`.cache`メソッドをぶら下げながら、
82
+ ある程度の所まではPromiseで引っ張った方が綺麗に書けるでしょうね。

1

おまけ追加

2020/11/09 18:49

投稿

miyabi-sun
miyabi-sun

スコア21459

answer CHANGED
@@ -56,4 +56,29 @@
56
56
  ).catch(e =>
57
57
  throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)
58
58
  );
59
+ ```
60
+
61
+ ---
62
+
63
+ 【おまけ】 エラーの書き方それでよかったっけ?
64
+
65
+ awaitが待ったPromiseがPromise.reject終わりになる場合、
66
+ 外で包んだtry-catchで取得出来ます。
67
+
68
+ 挙動の統一ということで解答欄はあのような記述にしましたが、ちゃんと動作するんでしょうかね?
69
+ ちょっと不安……
70
+
71
+ async/await構文を使っていくなら
72
+ こっちの方が良いでしょう。
73
+
74
+ ```js
75
+ try {
76
+ var resp = await requestPromise.put(options)
77
+ .catch(() => requestPromise.put(options))
78
+ .catch(() => requestPromise.put(options))
79
+ .catch(() => requestPromise.put(options));
80
+ // 後続処理
81
+ } catch (e) {
82
+ throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)
83
+ }
59
84
  ```