[解決済み] ES8 async/awaitをストリームで使用するには?
2022-12-07 20:20:23
質問
で https://stackoverflow.com/a/18658613/779159 は、組み込みの暗号ライブラリとストリームを使用してファイルのmd5を計算する方法の例です。
var fs = require('fs');
var crypto = require('crypto');
// the file you want to get the hash
var fd = fs.createReadStream('/some/file/name.txt');
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
fd.on('end', function() {
hash.end();
console.log(hash.read()); // the desired sha1sum
});
// read all file and pipe it (write it) to the hash object
fd.pipe(hash);
しかし、上記のようにコールバックを使用する代わりに、ES8 async/awaitを使用して、ストリームを使用する効率を維持したまま、これを変換することは可能でしょうか?
どのように解決するのですか?
async
/
await
はプロミスでのみ動作し、ストリームでは動作しません。独自の構文を持つストリームのようなデータ型を作るアイデアもありますが、それは非常に実験的なもので、詳細には触れません。
とにかく、あなたのコールバックはストリームの終わりを待っているだけなので、プロミスに完璧に適合しています。ストリームをラップすればいいだけです。
var fd = fs.createReadStream('/some/file/name.txt');
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
// read all file and pipe it (write it) to the hash object
fd.pipe(hash);
var end = new Promise(function(resolve, reject) {
hash.on('end', () => resolve(hash.read()));
fd.on('error', reject); // or something like that. might need to close `hash`
});
これで、そのプロミスを待つことができます。
(async function() {
let sha1sum = await end;
console.log(sha1sum);
}());
関連
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期関数+await+setTimeoutの組合せ
-
[解決済み] トップレベルでasync/awaitを使用するにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] JSHintの'+'前の改行不良の説明
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ