[解決済み] Promise() コンストラクタの内部で async/await を使用するのはアンチパターンでしょうか?
2022-05-11 17:30:45
質問
を使用しています。
async.eachLimit
関数を使用して、一度に実行できる操作の最大数を制御します。
const { eachLimit } = require("async");
function myFunction() {
return new Promise(async (resolve, reject) => {
eachLimit((await getAsyncArray), 500, (item, callback) => {
// do other things that use native promises.
}, (error) => {
if (error) return reject(error);
// resolve here passing the next value.
});
});
}
見ての通り、このままでは
myFunction
の2番目のコールバック内の値にアクセスできないので、非同期関数として使用します。
eachLimit
関数を使用します。
どのように解決するのですか?
プロミスコンストラクタ・エグゼキュータ関数の内部で効率的にプロミスを使用しているので、この プロミスコンストラクタのアンチパターン .
あなたのコードは、主なリスクである「すべてのエラーを安全に伝搬させない」ことの良い例です。理由を読む そこで .
を使用し、さらに
async
/
await
は、同じトラップでもさらに驚きを与えることができます。比べてみてください。
let p = new Promise(resolve => {
""(); // TypeError
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.
素朴な(間違った)気持ちで
async
と同等です。
let p = new Promise(async resolve => {
""(); // TypeError
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e)); // Doesn't catch it!
最後の1つはブラウザのウェブコンソールを見てください。
最初のものは、任意の
即時
例外が発生した場合,新たに構築されたプロミスは拒否されます(ただし,プロミスコンストラクタの実行関数内の
.then
は自己責任でお願いします)。
2つ目の方法はうまくいきません。
async
関数は
によって返される暗黙の約束です。
async
関数自体
.
プロミスコンストラクタの実行関数の戻り値は未使用なので、これは悪いニュースです!プロミスコンストラクタの実行関数の戻り値は未使用なので、これは悪いニュースです。
あなたのコード
を定義できない理由はない。
myFunction
として
async
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
// do other things that use native promises.
}, error => {
if (error) return reject(error);
// resolve here passing the next value.
});
});
}
とはいえ、せっかく
await
?
関連
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】"フォームが接続されていないため、フォームの送信がキャンセルされました "というエラーの取得について
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] async/await関数を並列に呼び出す
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み】非同期/待機クラス コンストラクタ
-
[解決済み] return await promise`と`return promise`の違いについて
-
[解決済み] async/awaitは暗黙のうちにプロミスを返すのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
要素ツリー制御によるvueTreeテーブル
-
Vueの要素ツリーコントロールに破線を追加する説明
-
Javascript Bootstrapのグリッドシステム、ナビゲーションバー、ローテーションの説明
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
Vueのフィルタの説明
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み] ある要素が存在するまで待つには?
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?