[解決済み] 約束を守らなかったり、拒否したりするとどうなる?
質問
私は、プロミスを返すシナリオを持っています。 プロミスは基本的にajaxリクエストによって引き起こされます。
プロミスを拒否すると、サーバーエラーが発生したというエラーダイアログが表示されます。
私がやりたいことは、応答コードが401のとき、約束を解決することも拒否することもしたくありません(すでにエラーダイアログが表示されているからです)。私は単にログインページにリダイレクトしたいのです。
私のコードは次のようなものです。
function makeRequest(ur, params) {
return new Promise(function (resolve, reject) {
fetch(url, params).then((response) => {
let status = response.status;
if (status >= 200 && status < 300) {
response.json().then((data) => {
resolve(data);
});
} else {
if (status === 401) {
redirectToLoginPage();
} else {
response.json().then((error) => {
if (!error.message) {
error.message = constants.SERVER_ERROR;
}
reject({ status, error });
});
}
}
});
});
}
ご覧の通り、ステータスが401の場合、ログインページにリダイレクトしています。約束は解決も拒否もされていません。
このコードに問題はないでしょうか、それともこれを達成するためにもっと良い方法があるでしょうか。
どのように解決するのですか?
プロミスはJavascriptのプロパティを持つ単なるオブジェクトです。 魔法はありません。 そのため、プロミスの解決や拒否に失敗しても、状態を"pending"から他のものに変更することはできません。 プロミスは通常のJavascriptのオブジェクトなので、これはJavascriptの基本的な問題を引き起こしません。 どのコードもプロミスへの参照を保持しない場合、プロミスはまだ(たとえまだ保留中であっても)ガベージコレクションされます。
ここでの本当の結果は、その状態が決して変更されない場合、プロミスの消費者に何を意味するのか、ということです。 どんな
.then()
または
.catch()
リスナーは決して呼び出されることはありません。 プロミスを使うほとんどのコードは、将来のある時点で解決または拒否されることを期待しています(それがそもそもプロミスが使われる理由です)。 もしそうでなければ、そのコードは一般的に決してその仕事を終えることができません。
そのタスクのための仕事を終わらせる他のコードがあって、プロミスはその仕事をすることなくただ放棄される可能性があります。 しかし、それはプロミスがどのように動作するように設計されたかではなく、一般的にプロミスの消費者がどのように動作することを期待しているかということではありません。
ステータスが401の場合、ログインページにリダイレクトされるのがお分かりになると思います。 プロミスは解決も拒否もされていません。
このコードで大丈夫でしょうか?または、これを達成するために何か良い方法がありますか。
この特定のケースでは、すべてOKで、リダイレクトはやや特殊でユニークなケースです。 新しいブラウザ ページへのリダイレクトは、現在のページの状態 (すべての Javascript の状態を含む) を完全にクリアするので、リダイレクトでショートカットを行い、他のものを未解決のままにするだけでもまったく問題ありません。 新しいページがロードされ始めると、システムは Javascript の状態を完全に再初期化するので、まだ保留されていた約束はすべてクリーンアップされます。
関連
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?
-
[解決済み] JavascriptのPromiseを関数スコープ外で解決する
-
[解決済み] 早期解決・早期却下の後、戻る必要はありますか?
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] ECMAScriptとは?
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] JavaScriptでDIVを表示・非表示にするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法