回答編集履歴
2
Promise流儀のエラーハンドリングに変更
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 =>
|
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 =>
|
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
|
-
|
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
|
65
|
+
async/await構文を使ってコードを書くとこんな感じになりますね。
|
66
|
-
|
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
|
-
|
72
|
+
resp = await requestPromise.put(options);
|
77
|
-
|
73
|
+
break;
|
78
|
-
.catch(() => requestPromise.put(options))
|
79
|
-
|
74
|
+
} catch (e) {} // お行儀が悪いがエラーは握りつぶす
|
80
|
-
|
75
|
+
}
|
81
|
-
|
76
|
+
if (resp == null) {
|
82
77
|
throw new Error("データ更新に失敗しました。 ErrorMessage : " + e.message)
|
83
78
|
}
|
84
|
-
```
|
79
|
+
```
|
80
|
+
|
81
|
+
やはり`.cache`メソッドをぶら下げながら、
|
82
|
+
ある程度の所まではPromiseで引っ張った方が綺麗に書けるでしょうね。
|
1
おまけ追加
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
|
```
|