[解決済み] 非同期関数の外側でawaitを使用する
質問
私は2つの非同期関数を一緒に連結しようとしました。1つ目は条件付きの戻りパラメータを持っていて、2つ目が実行されるか、モジュールを終了させるかするからです。しかし、私は仕様で見つけることができない奇妙な動作を発見しました。
async function isInLobby() {
//promise.all([chained methods here])
let exit = false;
if (someCondition) exit = true;
}
これは私のコードの断片です (完全なスコープを見ることができます。 ここで を参照してください)、それは単にプレイヤーがすでにロビーにいるかどうかをチェックするだけですが、それは関係ありません。
次に、この非同期関数があります。
async function countPlayer() {
const keyLength = await scardAsync(game);
return keyLength;
}
この関数は、もし
exit === true
.
を行おうとしたのですが
const inLobby = await isInLobby();
これは結果を待ち望むもので、私は
inLobby
を条件付きで実行するために
countPlayer
を条件付きで実行しましたが、詳細不明のtypeerrorを受け取りました。
なぜあなたは
await
アン
async
関数のスコープの外側にある?シュガープロミスであることは分かっているので、連鎖的に
then
に連鎖しなければならないことは分かっていますが、なぜ
countPlayer
では別のプロミスを待つことが出来ますが、外では
await
isInLobby
?
どのように解決するのですか?
トップレベル
await
はサポートされていません。この理由については、標準化委員会でいくつかの議論があり、例えば
このGithubの問題
.
また にあるthinkpieceもあります。 にも、トップレベルの await がなぜ悪いアイデアなのかについての考察があります。具体的には、以下のようなコードがある場合、彼はそれを提案しています。
// data.js
const data = await fetch( '/data.json' );
export default data;
現在
任意の
をインポートするファイル
data.js
をインポートする ファイルはフェッチが完了するまで実行されないので、すべてのモジュールのロードがブロックされます。私たちはトップレベルの Javascript が同期的に予測可能に実行されることに慣れているので、これではアプリのモジュールの順序を推論するのが非常に難しくなります。これが許可されると、関数がいつ定義されるかを知ることが厄介になります。
私の見解
は、モジュールをロードするだけで副作用が発生するのはバッドプラクティスだということです。つまり、あなたのモジュールの消費者は、あなたのモジュールを必要とするだけで、副作用を受けることになります。これは、モジュールが使用される場所をひどく制限します。トップレベルの
await
にある API から読み込んだり、サービスを呼び出したりしていることを意味します。
ロード時間。
代わりに、消費者が自分のペースで使用できる非同期関数をエクスポートする必要があります。
関連
-
[解決済み] 要素外でのクリックを検出するにはどうすればよいですか?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] async/await関数を並列に呼び出す
-
[解決済み] 非同期関数+await+setTimeoutの組合せ
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] ECMAScriptとは?
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法