ECMAScript の Promise ES2015 と async/await ES2017 機能がリリースされて以来、非同期はフロントエンドの世界で特に一般的な操作になりました。非同期コードと同期コードが問題を処理する順序には若干の違いがあります。非同期コードを書くには、同期コードを書く場合とは異なる「意識」が必要です。 コードの実行に長い時間がかかる場合はどうなりますか?これが同期コードの場合、「無応答」、または平易な言葉で言えば「死」と呼ばれる現象が発生しますが、非同期コードの場合はどうなるでしょうか。結果は得られないかもしれませんが、他のコードは何も起こらなかったかのように続行されます。 もちろん、実際に何も起こらなかったわけではなく、状況が異なれば異なる現象が起こるというだけです。たとえば、読み込みアニメーションのあるページは常に読み込み中のように見えます。別の例としては、データが更新されるはずなのにデータの変更が見えないページがあります。 例えば、どうやってもダイアログボックスを閉じることができない…このような現象をバグと呼びます。しかし、非同期操作プロセスが「エコー」せず、そこで静かに終了する場合もあります。誰もそれを知ることはなく、ページが更新された後は痕跡さえ残りません。 Axiosにはタイムアウト処理機能が搭載されているAxios を使用して Web API 呼び出しを行うことは、一般的な非同期操作プロセスです。通常、コードは次のように記述されます。 試す { const res = axios.get(url, options); を待機します。 //TODO 後続の業務を通常どおり続行します} catch(err) { // TODO フォールトトレランスを実行するかエラーを報告する} このコードは通常はうまく機能しますが、ある日ユーザーから「なぜこんなに長く待っても応答がないのか」という苦情が寄せられます。 その後、開発者は、サーバーへの負荷が増大したため、この要求に即座に応答することが困難であることに気付きました。ユーザーの気持ちを考慮して、読み込みアニメーションが追加されます。 試す { 読み込み中を表示します。 const res = axios.get(url, options); を待機します。 //TODO 通常業務} catch (err) { //TODO フォールトトレランス処理} finally { 読み込みを非表示にします(); } しかし、ある日、あるユーザーが「30 分待ったが、ぐるぐる回り続けるだけだ!」と言いました。そこで開発者は、何らかの理由でリクエストが停止していることに気付きました。この場合、リクエストを再送信するか、ユーザーに直接報告する必要があります。つまり、タイムアウト チェックを追加する必要があります。 幸いなことに、Axios はタイムアウトを処理できます。 試す {...} キャッチ(エラー){ if (err.isAxiosError && !err.response && err.request && err.message.startsWith("タイムアウト")) { // Axios リクエストが間違っていて、メッセージが遅延メッセージである場合 // TODO はタイムアウトを処理します} } ついに {...} Axios は問題ありませんが、 fetch() タイムアウトの処理
const ac = 新しい AbortController(); const {シグナル} = ac; fetch(url, { signal }).then(res => { //TODO ビジネスを処理する}); // 1 秒後にフェッチ操作をキャンセルします setTimeout(() => ac.abort(), 1000); 上記の例は const ac = 新しい AbortController(); const {シグナル} = ac; タイムアウトを設定します(() => ac.abort(), 1000); const res = await fetch(url, { signal }).catch(() => undefined); リクエストの失敗を処理するために ここで終了することもできましたが、各 非同期関数 fetchWithTimeout(timeout, resoure, init = {}) { const ac = 新しい AbortController(); 定数シグナル = ac.signal; setTimeout(() => ac.abort(), タイムアウト); return fetch(リソース、{...init、signal}); } それでいいですか?いいえ、問題があります。 上記のコードの タイムアウトを設定する(() => { console.log("タイムアウトです"); ac.abort(); }、 タイムアウト); そして、電話には十分な時間をかけましょう。 fetchWithTimeout(5000, url).then(res => console.log("success")); 出力 ちなみに、 非同期関数 fetchWithTimeout(timeout, resoure, init = {}) { const ac = 新しい AbortController(); 定数シグナル = ac.signal; 定数タイマー = setTimeout(() => { console.log("タイムアウトです"); ac.abort() を返します。 }、 タイムアウト); 試す { return await fetch(resoure, { ...init, signal }); ついに タイマーをクリアします。 } } 完璧!しかし、問題はまだ終わっていません。 すべてがタイムアウトになる可能性があるAxios と fetch はどちらも非同期操作を中断する方法を提供していますが、 そのような約束に対して、私が言えるのは、彼を行かせなさい、彼が永遠にそれを続けさせなさいということだけです。どうせ私は彼を止めることはできません。でも人生は続いていくので、待ち続けることはできません! この場合、 Race はレースを意味するので、 関数 waitWithTimeout(promise, timeout, timeoutMessage = "timeout") { タイマーを設定します。 const timeoutPromise = 新しい Promise((_, 拒否) => { タイマー = setTimeout(() => 拒否(timeoutMessage)、タイムアウト); }); Promise.race([timeoutPromise, promise]) を返します。 .finally(() => clearTimeout(timer)); // タイマーをクリアするのを忘れないでください } 効果をシミュレートするために Timeout を記述できます。 (非同期() => { const business = new Promise(resolve => setTimeout(resolve, 1000 * 10)); 試す { waitWithTimeout(ビジネス、1000) を待機します。 console.log("[成功]"); } キャッチ (エラー) { console.log("[エラー]", err); // [エラー] タイムアウト } })(); 上記は、JavaScript フロントエンドのタイムアウト非同期操作に対する完璧なソリューションの詳細な内容です。フロントエンドのタイムアウト非同期操作の解決の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: CSS で中空マスク レイヤーを実装するサンプル コード
オリジナルリンクhttps://github.com/XboxYan/no…ボタンは、おそらく We...
方法は2つあります: 1. サービス方法ファイアウォールのステータスを確認します。 [root@ce...
最近、個人の Web サイトに非常にシンプルなカラー スキーム (テーマ) スイッチャーを追加しまし...
良い画像素材のウェブサイトを見つけるのは難しいです。特に無料です。良い写真には非常に目を引く視覚効果...
目次概要必要とするアプリURL PWA にはどのような技術コンポーネントが必要ですか?マニフェストフ...
結果:実装コードhtml <ul class="スライド"> <...
1. muttをインストールするsudo apt-get install mutt 2. msmtp...
目次序文:実装手順:完全なソースコード:詳細情報:序文: vueでは、デフォルトページを実装し、di...
参考までに、Javascript を使用して広告を閉じる方法に関するケース スタディを示します。詳細...
目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...
どの企業もユーザーベースを拡大したいのであれば、ユーザーの操作データを収集・分析する必要があり、その...
1. 要素時間選択提出フォーマット変換例えば 2018年9月7日金曜日 00:00:00 GMT+0...
公式サイトから MySQL をダウンロードしてインストールし、クライアントにログインするにはどうすれ...
目次なぜ最適化するのですか? ?どこから始めますか? ?解決策は何ですか? ? ?どうやって選ぶ? ...
この記事では、星空アニメーションを実現するための高度な CSS3 LESS のサンプルコードを次のよ...